【设计模式】装饰者模式
2016-07-21 17:01
344 查看
前提导论
故事
装饰者模式
建立模型
实现代码
故事结局
夕阳西下,在外狩猎了一天的农夫王五准备回家了。到村门口的时候发现妻子正在家门口深情的等待着自己的归来。妻子接过王五打回来的猎物,看到有野鸡,于是妻子说,今晚吃烤鸡吧。王五听了也是开心点头说道,好啊,记得加盐哦,对了,再加点胡椒更有味。妻子笑着说,好好好。王五接着又说,再加点葱花啊,更香呢!
装饰者和被装饰者对象有相同的超类
可以用一个或多个装饰者包装一个对象
既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它
装饰者可以在所委托被装饰的行为之前或之后,加上自己的行为,已达到特定的目的。
对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢的装饰者来装饰对象
烤鸡—–>一种食物
佐料—–>一种食物
盐——->一种佐料
胡椒—->一种佐料
葱花—->一种佐料
定义装饰类超类Condiment
定义装饰类-盐
定义装饰类-胡椒
定义装饰类-葱花
定义被装饰对象类
转换成代码讲故事
运行结果
烤鸡 美味评分:4
烤鸡,撒上盐 美味评分:5
烤鸡,撒上盐,撒上胡椒 美味评分:7
烤鸡,撒上盐,撒上胡椒,撒上葱花 美味评分:10
故事
装饰者模式
建立模型
实现代码
故事结局
前提导论
为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式,今天作为第二个,一个很有意思的设计模式–装饰者模式。故事
这是一个美丽而又安静祥和的村庄,村里的人日出而作日落而息,村子里,农夫靠伐木和打猎为生,女人呢,额。。。。总之,大家过着幸福美满的生活。夕阳西下,在外狩猎了一天的农夫王五准备回家了。到村门口的时候发现妻子正在家门口深情的等待着自己的归来。妻子接过王五打回来的猎物,看到有野鸡,于是妻子说,今晚吃烤鸡吧。王五听了也是开心点头说道,好啊,记得加盐哦,对了,再加点胡椒更有味。妻子笑着说,好好好。王五接着又说,再加点葱花啊,更香呢!
装饰者模式
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰者和被装饰者对象有相同的超类
可以用一个或多个装饰者包装一个对象
既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它
装饰者可以在所委托被装饰的行为之前或之后,加上自己的行为,已达到特定的目的。
对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢的装饰者来装饰对象
建立模型
食物—–>基类烤鸡—–>一种食物
佐料—–>一种食物
盐——->一种佐料
胡椒—->一种佐料
葱花—->一种佐料
实现代码
定义抽象超类Foodpublic abstract class Food { public String description;//食物描述 public String getDescription(){//获取食物描述 return this.description; } public abstract int getDeliciousScore();//子类需要实现的获取美味评分 }
定义装饰类超类Condiment
public abstract class Condiment extends Food{ public abstract String getDescription();//装饰类中需要实现的行为 }
定义装饰类-盐
//盐 public class Salt extends Condiment{ private Food food; public Salt(Food food){ this.food=food; } @Override public int getDeliciousScore() { //盐本身的美味分值为1分 return 1+this.food.getDeliciousScore(); } @Override public String getDescription() { return this.food.getDescription()+",撒上盐"; } }
定义装饰类-胡椒
public class Pepper extends Condiment{ private Food food; public Pepper(Food food){ this.food = food; } @Override public int getDeliciousScore() { //胡椒美味值为2分 return 2+this.food.getDeliciousScore(); } @Override public String getDescription() { return this.food.getDescription()+",撒上胡椒"; } }
定义装饰类-葱花
public class ChoppedGreenOnion extends Condiment{ private Food food; public ChoppedGreenOnion(Food food){ this.food = food; } @Override public int getDeliciousScore() { //葱花美味值为3分 return 3+this.food.getDeliciousScore(); } @Override public String getDescription() { return this.food.getDescription()+",撒上葱花"; } }
定义被装饰对象类
public class RoastChicken extends Food{ public RoastChicken(){ description ="烤鸡"; } @Override public int getDeliciousScore() { //烤鸡美味分值4分 return 4; } }
转换成代码讲故事
public class Main { public static void main(String[] args) { //王五的妻子烧了一只烤鸡 Food roastChicken = new RoastChicken(); //王五忍不住的吃了一口,然后对妻子说出自己的美食评分 System.out.println(roastChicken.getDescription()+"\t美味评分:"+roastChicken.getDeliciousScore()); //接着妻子撒上了盐 Food roastChickenSalt = new Salt(roastChicken); //在撒了盐之后,王五吃了一口,说出自己的美食评分 System.out.println(roastChickenSalt.getDescription()+"\t美味评分:"+roastChickenSalt.getDeliciousScore()); //妻子撒上胡椒 Food roastChickenSaltPepper = new Pepper(roastChickenSalt); //在撒了胡椒之后,王五接着吃了一口,说出自己的美食评分 System.out.println(roastChickenSaltPepper.getDescription()+"\t美味评分:"+roastChickenSaltPepper.getDeliciousScore()); //妻子最后撒上葱花,一道美味的烤鸡正式完成了 Food roastChickenSaltPepperChoppedGreenOnion = new ChoppedGreenOnion(roastChickenSaltPepper); ///王五大快朵颐吃完后,说出自己的美食评分 System.out.println(roastChickenSaltPepperChoppedGreenOnion.getDescription()+"\t美味评分:"+roastChickenSaltPepperChoppedGreenOnion.getDeliciousScore()); } }
运行结果
烤鸡 美味评分:4
烤鸡,撒上盐 美味评分:5
烤鸡,撒上盐,撒上胡椒 美味评分:7
烤鸡,撒上盐,撒上胡椒,撒上葱花 美味评分:10
故事结局
王五一家吃了一餐美味的晚餐,然后洗洗睡了。。。。相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用