设计模式-装饰模式

来源:互联网 发布:阿里云代理收入 编辑:程序博客网 时间:2024/06/04 20:11
装饰模式(Decorator Pattern)   
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。关系图如下:


例子:咖啡和配料

咖啡和配料的通用接口
public interface Beverage {public String getDescription();public double cost();}


深焙咖啡
public class DarkRoast implements Beverage{@Overridepublic String getDescription() {return "深焙咖啡";}@Overridepublic double cost() {return 0.99;}}


摩卡
public class Mocha implements Beverage{Beverage beverage;public Mocha(Beverage beverage){this.beverage=beverage;}@Overridepublic String getDescription() {return beverage.getDescription()+",摩卡";}@Overridepublic double cost() {return beverage.cost()+0.2;}}


奶泡
public class Whip implements Beverage{Beverage beverage;public Whip(Beverage beverage){this.beverage=beverage;}@Overridepublic String getDescription() {return beverage.getDescription()+",奶泡";}@Overridepublic double cost() {return beverage.cost()+0.1;}}


测试
public class Demo {public static void main(String[] args) {Beverage beverage=new DarkRoast();beverage=new Mocha(beverage);beverage=new Whip(beverage);System.out.println("description:"+beverage.getDescription());System.out.println("cost:"+beverage.cost());}}


测试结果
description:深焙咖啡,摩卡,奶泡cost:1.29


刚接触装饰模式会感觉和继承没什么区别,继承也可以实现,但是仔细一想,比如:咖啡有n中,配料有m种,那么就可能有n*m种喝法,如果用继承,得有n*m个子类,而用装饰模式就只需要n个咖啡子类和m个配料子类。所以,装饰模式用在组合情况下非常方便。
原创粉丝点击