【设计模式】装饰者模式

      • 前提导论
      • 故事
      • 装饰者模式
      • 建立模型
      • 实现代码
      • 故事结局

前提导论

为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式,今天作为第二个,一个很有意思的设计模式–装饰者模式。

故事

这是一个美丽而又安静祥和的村庄,村里的人日出而作日落而息,村子里,农夫靠伐木和打猎为生,女人呢,额。。。。总之,大家过着幸福美满的生活。
夕阳西下,在外狩猎了一天的农夫王五准备回家了。到村门口的时候发现妻子正在家门口深情的等待着自己的归来。妻子接过王五打回来的猎物,看到有野鸡,于是妻子说,今晚吃烤鸡吧。王五听了也是开心点头说道,好啊,记得加盐哦,对了,再加点胡椒更有味。妻子笑着说,好好好。王五接着又说,再加点葱花啊,更香呢!

装饰者模式

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

  1. 装饰者和被装饰者对象有相同的超类
  2. 可以用一个或多个装饰者包装一个对象
  3. 既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它
  4. 装饰者可以在所委托被装饰的行为之前或之后,加上自己的行为,已达到特定的目的。
  5. 对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢的装饰者来装饰对象

建立模型

食物—–>基类
烤鸡—–>一种食物
佐料—–>一种食物
盐——->一种佐料
胡椒—->一种佐料
葱花—->一种佐料

【设计模式】装饰者模式_第1张图片

实现代码

  • 定义抽象超类Food
public 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

故事结局

王五一家吃了一餐美味的晚餐,然后洗洗睡了。。。。

你可能感兴趣的:(设计模式)