Design Pattern(4)-Decrator Pattern
来源:互联网 发布:网络直销做什么产品好 编辑:程序博客网 时间:2024/06/08 14:37
装饰者模式,比前面几种design pattern都复杂,一般情况下并不应该用它。它是为了尽量不修改原有类、接口的情况下为其动态添加功能。但是如果允许修改原有类,我觉得还是应该修改原有类,以达到更好的设计。用了装饰者模式,复杂度增加,不便于后续维护,好处是不需要修改现有的接口啊,不需要动其他使用该类的程序。
下面以一个麦当劳的例子,去麦当劳点一个果汁juice,你需要动态地实现加冰块、糖甚至其他东西。价格也随之变化,相信大家都做过鸡蛋饼或者武大郎烧饼啥的。麦当劳接口和类是原有的组件,我们不希望修改它。
McDonald接口:
public interface McDonald { double orderJuice();}
ConcreteMcDonald类:
public class ConcreteMcDonald implements McDonald { private double price; public ConcreteMcDonald(double primaryPrice){ this.price=primaryPrice; } @Override public double orderJuice() { System.out.println("you have ordered a juice"); return price; }}
Decorator抽象类:
public abstract class Decorator implements McDonald{ McDonald mcDonald; public Decorator(McDonald mcDonald){ this.mcDonald=mcDonald; }}
IceblocksDecrator类:
public class IceblocksDecrator extends Decorator { public IceblocksDecrator(McDonald mcDonald){ super(mcDonald); } @Override public double orderJuice() { double p=mcDonald.orderJuice()+1; System.out.println("you have added some ice blocks"); return p; }}
SugarDecrator类:
public class SugarDecrator extends Decorator { public SugarDecrator(McDonald mcDonald){ super(mcDonald); } @Override public double orderJuice() { double p=mcDonald.orderJuice()+3; System.out.println("you have added some sugar"); return p; }}
Client类:
public class Client { public static void main(String[] args){ McDonald mcDonald=new ConcreteMcDonald(10); mcDonald=new IceblocksDecrator(mcDonald); mcDonald=new SugarDecrator(mcDonald); System.out.print(mcDonald.orderJuice()); }}
输出:
you have ordered a juice
you have added some ice blocks
you have added some sugar
12.0
0 0
- Design Pattern(4)-Decrator Pattern
- AS3 Decrator Pattern
- Design Pattern 4-flyweight
- Design Pattern 4: Template
- Design pattern----Facade Pattern
- Design pattern----Strategy Pattern
- Design Pattern --------Observer pattern
- Design Pattern --- Factory Pattern
- Design Pattern - Factory Pattern
- Design Pattern - Factory Pattern
- [Design Pattern]Observer Pattern
- Design Pattern
- Design pattern
- Design Pattern
- Design Pattern
- Design Pattern
- Design Pattern
- design pattern
- 生产环境部署容器的五大挑战及应对之策
- RabbitMQ消息队列 详细介绍
- 重读设计模式,从面向对象开始
- Cisco ACS 5.4破解license及root shell
- java Synchronized关键字
- Design Pattern(4)-Decrator Pattern
- px+qy类问题
- 设计模式学习--外观模式
- 一篇关于c的杂文,无意中乱写整理
- Cesium原理篇:3D Tiles(1)渲染调度
- 博客前端vue和豆瓣页面
- 学习Spring必学的Java基础知识
- CCF真题2015.9.2
- 51nod1055: 最长等差数列(dp)