装饰模式

来源:互联网 发布:入骨相思知不知福禄 编辑:程序博客网 时间: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());    }}
原创粉丝点击