面向复用的软件设计模式(1)

    技术2022-07-10  159

    文章目录

    面向复用的软件设计模式(1)——结构模式复用设计的必要性三种结构模式适配器模式意图适配器模式中的三个角色一个适配器模式的例子 装饰模式解决的问题和方法几个角色一个装饰模式的例子 外观模式解决的问题各个角色之间的关系

    面向复用的软件设计模式(1)——结构模式

    复用设计的必要性

    复用具有成本有效性和及时性。 可以通过缩短软件生产周期来提高软件生产效率,使用更少的资源和人力来开发软件。不用耗费资源 “重复地造轮子”(reinvent-the-wheel)。减少了维护成本,可以生产质量更高、更加可靠、效率更高的软件。 复用可以产生可靠的软件 重用已经存在一段时间并且经过调试的功能是构建稳定子系统的基础。 复用产生标准化的软件 重用GUI库可在应用程序中产生通用的外观。与常规,连贯的设计保持一致。 一个面向复用的设计面对改变更加灵活、已于修复并且易于增加新的功能

    三种结构模式

    适配器模式(Adapter) 允许具有不兼容接口的类通过将其自己的接口包装在已存在的类的接口周围来协同工作。 装饰模式(Decorator) 在对象的现有方法中动态添加/覆盖行为 外观模式(Façade) 为大量代码提供简单的界面

    适配器模式

    意图

    为了解决类之间接口不兼容的问题或者为已有的类提供新的接口,而将类的接口转换为客户端期望的另一个接口的设计方法。比如现在已经实现了一个类,但是需要的功能的表现形式与这个类中的形式有一些差异,为了复用这个类,可以设计一个Adapter来适配现有的类,使之能够满足要求的形式。这是一种通过添加额外的间接层(Adapter)来解决不协调/不兼容的问题的方法。

    适配器模式中的三个角色

    Adaptee:现有的类ITarget:现有库中定义的接口Adapter:创造的继承自Adaptee的类,同时实现了ITarget接口。调用继承自Adaptee的特殊方法来实现ITarget中定义的方法。几个角色之间的关系如下:

    一个适配器模式的例子

    public class DogBarkOnce{//现有的类(Adaptee) protected void barkOnce(){ System.out.println("woof"); } } public class Dog{//目标接口(ITarget) void bark(); } public class BarkDog extends DogBarkOnce implements Dog{//适配器(Adapter) @Override public void bark(){ barkOnce(); } }

    在这个例子中,为了让现有的DogBarkOnce适配Dog接口,设计了BarkDog适配器,继承自DogBarkOnce类并且使用继承的barkOnce()方法实现接口中的bark()方法。最终实现了现有类的复用。 这里使用了继承(inheritance)来进行复用,也可以使用委托(delegation)来复用,关于继承和委托的区别,可以参考模块级别的复用——继承和委托。 下面也给出使用委托的代码:

    public class BarkDog implements Dog{//适配器(Adapter) private DogBarkOnce d=new DogBarkOnce(); @Override public void bark(){ d.barkOnce(); } }

    装饰模式

    解决的问题和方法

    问题:需要对对象进行任意或动态的扩展组合。比如有对于Stack类的几个扩展:UndoStack、SecureStack、SynchronizedStack,实现这几个扩展的组合,如果使用继承机制的话,继承关系会很庞大且复杂。因此产生了装饰模式。方法:实现一个通用的接口作为要扩展的对象,将主要功能委托给基础对象(Stack),然后添加功能(undo、secure ⋯ \cdots )以递归的方式实现

    几个角色

    Component:是一个接口,定义了装饰物执行的公共操作ConcreteComponent:起始对象,在此基础上增加功能,通用的方法在这个对象中实现。Decorator:所有装饰类的抽象基类,实现Component接口,并且包含成员变量component指向被装饰对象。ConcreteDecorator:实际的装饰类,能够在其上添加功能,可以有任意多个实际装饰类,每一个都代表了一个可以被添加的功能。这几个角色之间的关系如下:

    一个装饰模式的例子

    public interface IceCream{//顶层接口(Component) void addTopping(); } public class PlainIceCream implements IceCream{//基础实现(ConcreteComponent) @Override public void addTopping(){ System.out.println("Plain IceCream ready for some toppings!"); } } public abstract class ToppingDecorator implements IceCream{//装饰器基类(Decorator) protected IceCream input; public ToppingDecorator(Icecream i){ this.input=i; } public abstract void addTopping(); }

    几个具体装饰器(ConcreteDecorator):

    public class CandyTopping extends ToppingDecorator{ public CandyTopping(IceCream i){ super(i); } public void addTopping(){ input.addTopping(); //decorate others first System.out.println("Candy Topping added!"); } } public class NutsTopping extends ToppingDecorator{ //similar to CandyTopping } public class PeanutTopping extends ToppingDecorator{ //similar to CandyTopping }

    客户端代码:

    public class Client{ public static void main(String[] args){ IceCream a = new PlainIceCream(); IceCream b = new CandyTopping(a); IceCream c = new PeanutTopping(b); IceCream d = new NutsTopping(c); d.addTopping(); //or IceCream toppingIceCream = new NutsTopping( new PeanutTopping( new CandyTopping( new PlainIceCream() ) ) ); toppingIceCream.addTopping(); } }

    外观模式

    解决的问题

    问题:系统比较复杂,调用者希望有一个简单的接口来调用这个复杂系统的整体功能。提供了更高层次的接口使子系统更易于使用,将一个复杂的子系统用一个简单接口包装。

    各个角色之间的关系

    Processed: 0.018, SQL: 9