装饰模式
来源:互联网 发布:入骨相思知不知福禄 编辑:程序博客网 时间:2024/06/05 09:25
1.单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
2.开放-封闭原则:对于扩展是开放的,对于更改是封闭的
3.装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
4.结构图
5.装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需求有选择地,按顺序地使用装饰功能包装对象。
6.装饰模式的装饰顺序很重要。需要把所需的功能按正确的顺序串联起来进行控制
7.定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
7.要点 : 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为
8.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
9.例子一:穿衣服
(1)结构图
//ConcreteComponentpublic class Person { private String name ; public Person(){ } public Person(String name){ this.name = name ; } public void show(){ System.out.println(this.name); }}
//服装类public class Finery extends Person{ protected Person component ; //打扮 public void decorate(Person component){ this.component = component; } public void show(){ if(component != null){ component.show(); } }}
//具体服饰类public class Tshirts extends Finery{ public void show(){ System.out.println("大Tshirts"); super.show(); }}
//具体服饰类public class BigTrouser extends Finery{ public void show(){ System.out.println("垮裤"); super.show(); }}
public class MainTest { public static void main(String[] args) { Person xc = new Person("小菜"); System.out.println("第一种装扮:"); Tshirts t = new Tshirts(); BigTrouser b = new BigTrouser(); t.decorate(xc); b.decorate(t); b.show(); }}
10.例子二 定制汉堡
//被装饰者public abstract class Humburger { protected String name ; public String getName(){ return name ; } public abstract double getPrice();}
//被装饰者的初始状态,有些自己的简单装饰public class ChickenBurger extends Humburger{ public ChickenBurger(){ name = "鸡腿堡"; } @Override public double getPrice() { return 10; }}
//配料的基类(装饰者,用来对汉堡进行多层装饰,每层装饰增加一些配料public abstract class Condiment extends Humburger { public abstract String getName();}
public class Lettuce extends Condiment { Humburger humburger ; public Lettuce(Humburger humburger){ this.humburger = humburger ; } @Override public String getName() { // TODO Auto-generated method stub return humburger.getName()+"加生菜"; } @Override public double getPrice() { // TODO Auto-generated method stub return humburger.getPrice()+1.5; }}
public class Chilli extends Condiment{ Humburger humburger ; public Chilli(Humburger humburger){ this.humburger = humburger ; } @Override public String getName() { // TODO Auto-generated method stub return humburger.getName()+"加辣椒"; } @Override public double getPrice() { // TODO Auto-generated method stub return humburger.getPrice(); //辣椒免费 }}
public class Test { public static void main(String[] args) { Humburger humburger = new ChickenBurger();// System.out.println(humburger.getName() + " 价钱:" + humburger.getPrice()); Lettuce lettuce = new Lettuce(humburger); System.out.println(lettuce.getName() + " 价钱:" + lettuce.getPrice());// Chilli chilli = new Chilli(humburger);// System.out.println(chilli.getName() + " 价钱:" + chilli.getPrice());// Chilli chilli2 = new Chilli(lettuce);// System.out.println(chilli2.getName() + " 价钱:" + chilli2.getPrice()); }}
阅读全文
0 0
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- C# Task 是什么?返回值如何实现? Wait如何实现
- web安全常用测试用例
- 移动端开发的兼容问题
- [RK3288][Android6.0] Camera HAL ION 使用小结
- F745VGTx_HAL_RS485
- 装饰模式
- LeetCode-1
- 第一章:对象导论
- 04 Anykey右分页布局TableLayout
- F
- 总结-2017/11/26
- 二叉树的先序中序后序以及递归算法求高度和结点数目
- 96. Unique Binary Search Trees
- 算法二---排序(1)