您的位置:首页 > 编程语言 > Java开发

【设计模式】装饰者模式

2016-07-21 17:01 344 查看
前提导论

故事

装饰者模式

建立模型

实现代码

故事结局

前提导论

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

故事

这是一个美丽而又安静祥和的村庄,村里的人日出而作日落而息,村子里,农夫靠伐木和打猎为生,女人呢,额。。。。总之,大家过着幸福美满的生活。

夕阳西下,在外狩猎了一天的农夫王五准备回家了。到村门口的时候发现妻子正在家门口深情的等待着自己的归来。妻子接过王五打回来的猎物,看到有野鸡,于是妻子说,今晚吃烤鸡吧。王五听了也是开心点头说道,好啊,记得加盐哦,对了,再加点胡椒更有味。妻子笑着说,好好好。王五接着又说,再加点葱花啊,更香呢!

装饰者模式

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

装饰者和被装饰者对象有相同的超类

可以用一个或多个装饰者包装一个对象

既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它

装饰者可以在所委托被装饰的行为之前或之后,加上自己的行为,已达到特定的目的。

对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢的装饰者来装饰对象

建立模型

食物—–>基类

烤鸡—–>一种食物

佐料—–>一种食物

盐——->一种佐料

胡椒—->一种佐料

葱花—->一种佐料



实现代码

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

故事结局

王五一家吃了一餐美味的晚餐,然后洗洗睡了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息