设计模式-3-装饰者模式
2016-03-25 14:14
417 查看
装饰者模式(包装模式)
原理:动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更具有弹性(主要用来扩展功能)开放-关闭原则 http://www.itdaan.com/blog/2016/02/19/715102.html
比如:在我们日常生活中我们会去咖啡店,点咖啡的时候我们要点一个品种的咖啡+多种配料(品种有:HouseBlend、DarkRoast、Decat 配料有:Mocha、Whip、Milk等等)
算的总价格是各个咖啡+配料的钱,我们可以这样设计HouseBlend+Mocha类 HouseBlend+Whip类 HouseBlend+Milk类 DarkRoast+Mocha DarkRoast+Whip DarkRoast+Milk Decat +Mocha Decat +Whip Decat +Milk HouseBlend+Mocha+Milk等等n多个类实现他们的组合类,这样的方法是不可取的,因为类太多,或者当你需要添加新的功能,新的配料或者咖啡的时候,要实现很多的类。
在这里我们可以通过装饰着模式解决这个问题,我们可以先设定一个Component抽象类或者接口,然后有多个Concrete Component(我理解的主体)继承这个类或者实现这个接口,然后Decorator继承这个类或者实现这个接口(并且持有Component的引用),然后具体的Concrete Decorator继承这个Decorator类,实现具体的装饰,通过组合的方式实现不同的类的组合
装饰模式的角色
抽象构件角色 Component 给出一个抽象的接口,来规范准备接收附加责任的对象具体构件角色 Concrete Component 定义将要接收附加责任的类
装饰角色 Decorator 持有一个构件对象的引用,并定义一个与抽象构件接口一致的接口
具体装饰角色 Concrete Decorator 负责给构件对象“贴上”附加的责任
代码实例
Component//被装饰者抽象类 public abstract class Beverage { String description = "Unknow Beverage "; public String getDescription() { return description; } public abstract double cost(); }
Concrete Component (这里写三个,以后需要的话可以自己在添加)
第一个HouseBlend
//被装饰者具体类 public class HouseBlend extends Beverage{ public HouseBlend() { // TODO Auto-generated constructor stub description = "HouseBlend"; } @Override public double cost() { // TODO Auto-generated method stub return 1; } }第二个DarkRoast
//被装饰者具体类 public class DarkRoast extends Beverage{ public DarkRoast() { // TODO Auto-generated constructor stub description = "DarkRoast"; } @Override public double cost() { // TODO Auto-generated method stub return 2; } }第三个Decat
//被装饰者具体类 public class Decat extends Beverage{ public Decat() { // TODO Auto-generated constructor stub description = "Decat"; } @Override public double cost() { // TODO Auto-generated method stub return 3; } }
Decorator
//装饰者抽象类 public abstract class CondimentDecorator extends Beverage { // @Override因为这个类也是抽象类所以不用实现Beverage类的抽象方法:cost // public double cost() { // // TODO Auto-generated method stub // return 0; // } public abstract String getDescription(); }
Concreate Decorator(这里写三个,以后需要的话可以自己在添加)
第一个Milk
public class Milk extends CondimentDecorator{ public Beverage beverage; public Milk(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+" Milk"; } @Override public double cost() { // TODO Auto-generated method stub return 0.3+beverage.cost(); } }第二个Mocha
//装饰者具体类 public class Mocha extends CondimentDecorator { public Beverage beverage; public Mocha(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+" Mocha"; } @Override public double cost() { // TODO Auto-generated method stub return 0.2+beverage.cost(); } }第三个Whip
public class Whip extends CondimentDecorator { public Beverage beverage; public Whip(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+" Whip"; } @Override public double cost() { // TODO Auto-generated method stub return 0.4+beverage.cost(); } }在Main中我们可以实现他们各种各样的组合
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub //实现DarkRoast+无配料的组合 Beverage beverage = new DarkRoast(); System.out.println(beverage.getDescription()+"$"+beverage.cost()); //实现Decat+Mocha+Milk+Whip的组合 Beverage beverage2 = new Decat(); beverage2 = new Mocha(beverage2); beverage2 = new Milk(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription()+"$"+beverage2.cost()); } }
总结
1.装饰者和被装饰者对象有共同超类类型 可以用一个或者多个装饰着包装对象2
.
3.java中内置的装饰者模式(I/O流)
相关文章推荐
- 魔兽系统
- Android WebView开发问题及优化汇总
- 关于Modbus网关
- include过来的布局怎么找到其父控件
- Linux Source命令
- Bulk Insert Data
- C#基础(五)--枚举的含义及其应用
- HTML标签表格
- 自定义日历选择框--控制--日历插件
- Linux查看硬件信息以及驱动设备的命令
- iOS 项目的目录结构能看出你的开发经验
- iOS--xcode调试神技!直接crash在代码
- position:absolute、float、display:inline-block 区别
- HDU 5339Untitled
- MDM 用itms-services给ios设备推送应用 ios8以上版本 更新安装失败
- 数论-斐波那契数列
- App架构经验总结
- iOS--xcode调试神技!直接crash在代码
- 彻底解决Spring MVC 中文乱码 问题
- ElasticSearch 2 (35) - 信息聚合系列之近似聚合