关于设计模式:设计模式装饰器

3次阅读

共计 1527 个字符,预计需要花费 4 分钟才能阅读完成。

装璜者模式是一种结构型模式,它对现有的类进行包装,容许向一个现有的对象增加现有的性能,同时又不扭转其构造。

这种模式创立了一个新的装璜器类,用来包装原有的类。并在放弃类签名完整性的状况下提供了额定的性能。

用意:动静地给一个对象增加额定的职责,就新增红能来说,装璜器模式相比于生成子类更加灵便。

次要解决:通常咱们为了减少一个类的性能,常常应用继承的形式,因为继承引入动态代码的特色,并且随着扩大性能的增多,子类会很收缩。

如何应用; 在不想减少子类的状况下应用。

如何解决:将具体性能职责进行划分,同时继承装璜者模式。

要害代码:Component 类充当形象角色,不负责具体实现。装璜者类继承和援用 Component 类,具体扩大类重写父类办法。

有点:装璜类和被装璜类能够独立倒退,不会相互耦合。装璜模式是继承很好的的一个代替模式。

形象组件:

public abstract class Beverage {
    String description = "Unknow Beverage";
    public String getDescription(){return description;}

    public abstract double cost();}

形象装璜者类

public abstract class CondimentDecorator extends Beverage {public abstract String getDescription();
}

具体组件

public class Espresso extends Beverage{public Espresso(){description = "Espresso";}

    @Override
    public double cost() {return 1.99;}
}

具体装璜者

public class Mocha extends CondimentDecorator{
    Beverage beverage;
    public Mocha(Beverage beverage){this.beverage = beverage;}

    @Override
    public String getDescription() {return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {return 0.20 + beverage.cost();
    }
}

单元测试

public class MochaTest {

    @Test
    public void getDescription() {Beverage beverage = new Espresso();
        beverage = new Mocha(beverage);
        System.out.println(beverage.getDescription());
    }

    @Test
    public void cost() {Beverage beverage = new Espresso();
        beverage = new Mocha(beverage);
        System.out.println(beverage.cost());
    }
}

测试后果:
2.19
Espresso, Mocha

装璜者和被装璜者必须是一样的类型,也就是有独特的超类。这是相当要害的中央,所以咱们利用继承来达到类型匹配,而不是利用继承取得“行为”。

装璜者在和组件联合时,就是在退出新的行为。所失去的行为并不是继承自超类,而是由组合对象失去的。

如果依赖继承,那么类的行为只能在编译时动态决定。换句话说,行为不是来自超类,就是来自子类笼罩后的版本。然而利用组合,能够把装璜者混合着用,而且是在“运行时 ”.

因而这样就能够在任何时候,实现新的装璜者减少新的行为。如果依赖继承,每当须要新行为时,还得批改现有的代码。

正文完
 0