装饰器模式是一种结构设计模式,它动态地将附加行为附加到对象上。装饰器通过组合而不是子类化(继承)提供灵活的扩展原因。
当您想通过在运行时添加小行为来构造对象时,请使用装饰器模式。
装饰器类使用组合和继承,理解它们的意图至关重要。
在装饰器模式中,我们对组件和装饰器使用相同的类型。 Decorator 复合 Component 对象来获取行为,即获取 Component 对象中定义的字段或方法。而Decorator继承(扩展)了Component,使得Decorator对象可以声明为Component对象。
装饰器模式实现了开闭原则,即对扩展开放,对修改封闭。添加组件或装饰器很容易。例如,如果你想添加另一个具体的装饰器,你只需要创建一个代表它的类并扩展装饰器类。
想象一下我们正在为一家冰淇淋店开发一个系统。店里有各种冰淇淋和配料。系统需要显示冰淇淋的描述(包括其配料)和成本。
冰淇淋课:
// Component class public abstract class IceCream { public String description = "Unknown ice cream"; public String getDescription() { return description; } public abstract double cost(); }
巧克力冰淇淋类:
// Concrete component class public class ChocolateIceCream extends IceCream { public ChocolateIceCream() { description = "ChocolateIceCream"; } @Override public double cost() { return 1.99; } }
顶级班:
// Base decorator class public abstract class Topping extends IceCream { public IceCream iceCream; // All subclasses (concrete decorator classes) need to implement getDescription method, // by declaring this method as abstract, we enforce all subclasses to implement this method public abstract String getDescription(); }
枫坚果类:
// Concrete decorator class public class MapleNuts extends Topping { public MapleNuts(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", MapleNuts"; } @Override public double cost() { return iceCream.cost() + .30; } }
PeanutButterShell 类:
// Concrete decorator class public class PeanutButterShell extends Topping { public PeanutButterShell(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", PeanutButterShell"; } @Override public double cost() { return iceCream.cost() + .30; } }
客户端类:
public class Client { public static void main(String[] args) { IceCream iceCream = new ChocolateIceCream(); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new MapleNuts(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new PeanutButterShell(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); } }
输出:
ChocolateIceCream, .99 ChocolateIceCream, MapleNuts, .29 ChocolateIceCream, MapleNuts, PeanutButterShell, .59
您可以在这里查看所有设计模式的实现。
GitHub 存储库
附注
我是刚开始写科技博客,如果您对我的写作有什么建议,或者有任何困惑的地方,请留言!
感谢您的阅读:)
以上是装饰模式的详细内容。更多信息请关注PHP中文网其他相关文章!