三、装饰模式

1 装饰模式?

  动态的给一个对象添加一些额外的职能,就增加功能来说,装饰模式比生成子类更加灵活。就本例来说,一个对象是Person,通过装饰类添加“职责”,生成不同的装饰子类去具体的装饰。

2 装饰模式应用?

  当系统需要新增功能的时候,想旧的类中增加代码,完成新的“装饰”。

3 第一个例子中,只额外的增加一个功能类Finery(装饰类),也可以继续在原有的基础上增加,比如增加游玩类,然后再增加具体的游玩类的实现类去做更具体的装饰。这样,就把Person类的核心功能和装饰功能独立开来。就是把类的装饰功能从类中搬移出去,这样可以简化原有的类。第二个例子,共有两个类去装饰Person。

4 装饰着模式的意义?

就是为了简化核心类的设计,让核心功能实现在核心类中完成。把核心类的一些额外功能移除出去,去做单独的类,完成对核心类的装饰。

装饰者模式存在一个对象链。

代码如下:

package com.biao.text.demo1;
/*装饰着模式,就是动态的生成一个对象链,实现装饰。*/
public class Decorate {
    public static void main(String[] args) {
        Person person = new Person("cong");
        Finery finery = new Finery();
        ConcreteA concreteA = new ConcreteA();
        ConcreteB concreteB = new ConcreteB();
        ConcreteC concreteC = new ConcreteC();
        
        /*开始装饰*/
        finery.decorate(person);
        concreteA.decorate(finery);
        concreteB.decorate(concreteA);
        concreteC.decorate(concreteB);
        concreteC.show();
    }
}


/*首先创建被装饰的对象*/
class Person{
    private String name;

    public Person() {
        // TODO Auto-generated constructor stub
    }
    
    public Person(String name) {
        this.name = name;
    }
    
    public void show(){
        System.out.println("装饰的"+name);
    }
}
/*创建装饰Person的类,该类中要维护一个Person的引用。*/
class Finery extends Person{
    private Person person;
    public void decorate(Person person){
        this.person = person;
    }
    @Override
    public void show() {
        // TODO Auto-generated method stub
        if(person != null){
            person.show();
        }
//        super.show();
    }
}
/*更具体的装饰类的子类,实现更具体的装饰*/
class ConcreteA extends Finery{
    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("日韩裤");
        super.show();
    }
}
class ConcreteB extends Finery{
    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("皮鞋");
        super.show();
    }
}
class ConcreteC extends Finery{
    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("帽子");
        super.show();
    }
}

如果增加两个额外的功能,用什么衣服装饰+喜欢去哪些地方玩(还可以对核心类Person进行更多功能的附加)

《总结:继承核心类,编写自己的子类,去完成装饰》

package com.biao.text.demo1;
/*装饰着模式,就是动态的生成一个对象链,实现装饰。*/
public class Decorate {
    public static void main(String[] args) {
        Person person = new Person("cong");
        Finery finery = new Finery();
        ConcreteA concreteA = new ConcreteA();
        ConcreteB concreteB = new ConcreteB();
        ConcreteC concreteC = new ConcreteC();
        
        /*第一功能装饰*/
        finery.decorate(person);
        concreteA.decorate(finery);
        concreteB.decorate(concreteA);
        concreteC.decorate(concreteB);
        /*第二功能装饰*/
        Play play = new Play();
        Play1 play1 = new Play1();
        Play2 play2 = new Play2();
        play.decorate(person);
        play1.decorate(play);
        play2.decorate(play1);
        
        
        concreteC.showfunction1();
        play2.showfunction2();
    }
}


/*首先创建被装饰的对象*/
class Person{
    private String name;//对应一个装饰类
    private String place;//继续增加额外功能,在加入一个装饰

    public Person() {
        // TODO Auto-generated constructor stub
    }
    
    public Person(String name) {
        this.name = name;
    }
    
    public void showfunction1(){
        System.out.println("装饰的"+name);
    }
    public void showfunction2(){
        System.out.println("是我喜欢去的地方");
    }
}
/*创建装饰Person的类,该类中要维护一个Person的引用。*/
class Finery extends Person{
    private Person person;
    public void decorate(Person person){
        this.person = person;
    }
    @Override
    public void showfunction1() {
        // TODO Auto-generated method stub
        if(person != null){
            person.showfunction1();
        }
//        super.show();
    }
}
/*更具体的装饰类的子类,实现更具体的装饰*/
class ConcreteA extends Finery{
    @Override
    public void showfunction1() {
        // TODO Auto-generated method stub
        System.out.println("日韩裤");
        super.showfunction1();
    }
}
class ConcreteB extends Finery{
    @Override
    public void showfunction1() {
        // TODO Auto-generated method stub
        System.out.println("皮鞋");
        super.showfunction1();
    }
}
class ConcreteC extends Finery{
    @Override
    public void showfunction1() {
        // TODO Auto-generated method stub
        System.out.println("帽子");
        super.showfunction1();
    }
}


class Play extends Person{
    private Person person;
    public void decorate(Person person){
        this.person = person;
    }
    
    public void showfunction2(){
        if(person != null){
            person.showfunction2();
        }
    }
}

class Play1 extends Play{
    @Override
    public void showfunction2() {
        // TODO Auto-generated method stub
        System.out.println("北京");
        super.showfunction2();
    }
}
class Play2 extends Play{
    @Override
    public void showfunction2() {
        // TODO Auto-generated method stub
        System.out.println("上海");
        super.showfunction2();
    }
}

//程序运行结果
帽子
皮鞋
日韩裤
装饰的cong
去上海玩
去北京玩
是我喜欢去的地方

 

posted @ 2017-09-25 22:04  国境之南时代  阅读(145)  评论(0编辑  收藏  举报