设计模式——装饰者模式

来源:互联网 发布:win10右下角网络红叉 编辑:程序博客网 时间:2024/06/06 06:56

3.

OO原则:对扩展开放,对修改关闭

OO模式:装饰者模式——动态地将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择。


例子:咖啡店处理咖啡、配料的关系

public abstract class Beverage {String description = "Unknown Beverage";  public String getDescription() {return description;} public abstract double cost();}


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

public class HouseBlend extends Beverage {public HouseBlend() {description = "House Blend Coffee";} public double cost() {return .89;}}


public class DarkRoast extends Beverage {public DarkRoast() {description = "Dark Roast Coffee";} public double cost() {return .99;}}


public class Soy extends CondimentDecorator {Beverage beverage;public Soy(Beverage beverage) {this.beverage = beverage;}public String getDescription() {return beverage.getDescription() + ", Soy";}public double cost() {return .15 + beverage.cost();}}


public class Mocha extends CondimentDecorator {Beverage beverage; public Mocha(Beverage beverage) {this.beverage = beverage;} public String getDescription() {return beverage.getDescription() + ", Mocha";} public double cost() {return .20 + beverage.cost();}}

public class Whip extends CondimentDecorator {Beverage beverage; public Whip(Beverage beverage) {this.beverage = beverage;} public String getDescription() {return beverage.getDescription() + ", Whip";} public double cost() {return .10 + beverage.cost();}}


public class StarbuzzCoffee { public static void main(String args[]) {Beverage beverage = new Espresso();System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage2 = new DarkRoast();beverage2 = new Mocha(beverage2);beverage2 = new Mocha(beverage2);beverage2 = new Whip(beverage2);System.out.println(beverage2.getDescription() + " $" + beverage2.cost()); Beverage beverage3 = new HouseBlend();beverage3 = new Soy(beverage3);beverage3 = new Mocha(beverage3);beverage3 = new Whip(beverage3);System.out.println(beverage3.getDescription() + " $" + beverage3.cost());}}


以下是上述类的关系图:




原创粉丝点击