设计模式No.2——装饰者模式
来源:互联网 发布:淘宝等级怎么升 编辑:程序博客网 时间:2024/05/23 07:24
要给一个类添加属性或方法,除了直接在源文件中添加这种简陋的方法外,就是继承某个类或者与将其与某个类关联(作为内部属性等)起来,但如果要动态的添加,这两种方法都不合适,装饰者模式,应运而生。
先说装饰者模式的结构图
最上层的接口,是抽象的被装饰组件,里面只有抽象的方法,紧跟其下的两个类,左边是具体的被装饰组件,右边是抽象的被装饰者,最下层的两个类,是具体的装饰者,需要强调的是,装饰者是不需要知道被装饰者的存在的,也就是说,具体装饰者A、B和具体的被装饰者之间,没有任何的直接交互
这段话说的有点拗口,来一个简单的实例吧,假设我开了一家咖啡店,提供各种口味的咖啡,例如黑咖啡、卡布奇诺、拿铁等,每种咖啡都可以加方糖、奶精等等,那我怎样用代码实现价格计算,给每种咖啡定一个价格吗,黑咖啡原版、黑咖啡加糖版、黑咖啡加奶版、卡布奇诺原版、卡布奇诺加糖版……这显然不是一个聪明的做法,实际情况是怎么做的呢?黑咖啡、卡布奇诺、拿铁各有各的价,方糖、奶精也各有各的价,黑咖啡加方糖,或是其他什么组合,都只需要把两者的价格加起来就是了,这,就是装饰者模式,下面是这个例子的代码实现:
抽象的咖啡接口
public interface Coffee {public int showPrice();public String showTaste();}具体的某种咖啡类(黑咖啡)
public class BlackCoffee implements Coffee {private int price = 10;private String taste = "黑咖啡";@Overridepublic int showPrice() {// TODO Auto-generated method stubreturn price;}@Overridepublic String showTaste() {// TODO Auto-generated method stubreturn taste;}}
抽象的咖啡伴侣类(方糖、奶精的父类)
public class Mate implements Coffee{private Coffee coffee;public Mate(Coffee coffee) {this.coffee= coffee;}@Overridepublic int showPrice() {return coffee.showPrice();}@Overridepublic String showTaste() {return coffee.showTaste();}}
具体的咖啡伴侣
public class MilkDeco extends Mate{public MilkDeco(Coffee coffee) {super(coffee);}@Overridepublic int showPrice() {// TODO Auto-generated method stubreturn super.showPrice()+2;}@Overridepublic String showTaste() {return super.showTaste()+"+牛奶";}}
package DecorateStyle2;public class SugarDeco extends Mate{public SugarDeco(Coffee coffee) {super(coffee);}@Overridepublic int showPrice() {return super.showPrice()+1;}@Overridepublic String showTaste() {return super.showTaste()+"+糖";}}测试类
public class Test {public static void main(String[] args) {Coffee coffee=new BlackCoffee();SugarDeco sugar =new SugarDeco(coffee);MilkDeco milk=new MilkDeco(sugar);System.out.println(sugar.showTaste()+" "+sugar.showPrice());System.out.println(milk.showTaste()+" "+milk.showPrice());}}
输出结果:
黑咖啡+糖 11
黑咖啡+糖+牛奶 13
0 0
- 设计模式No.2——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- 设计模式——装饰者模式
- python写exploit
- ACM牛人给的新手建议
- 手机淘宝性能优化
- linux下彻底卸载mysql 图解教程
- Activity生命周期
- 设计模式No.2——装饰者模式
- 【转载】经营成功的测试生涯
- HashSet,TreeSet 和 LinkedHashSet比较
- C#将Unicode编码转换为汉字字符串
- 为什么重写equals方法,一定要重写HashCode方法?
- 编程个人体会
- HDU 2119
- Bootstrap入门速成-效果概述
- Fisher vector