装饰者模式

装饰者模式:动态地给现有的类添加新功能;既然是装饰者,那么意味着,这些功能是可以随时添加,也可以随时拆卸,正如人穿衣服,多穿一件衣服与少穿一件衣服,并不会影响人本身一样。

现在有一个Person:

package com.lin.Decorator;

public class Person {
    
    private String name;
    
    public Person() {}
    
    public Person(String name) {
        this.name = name;
    }
    
    //显示装扮
    public void show(){
        System.out.println("装扮的"+name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

 

为了给这个person增加装饰:我们需要一个个装饰类,由于没有接口,我们选择用继承的方式,创建一个装饰类:

package com.lin.Decorator;

/**
 * 
 * 装饰类(所有装饰都继承此类)
 * @author lin
 *
 */
public class Decorator extends Person {
    
    protected Person person;
    
    //装扮
    public void decorate(Person person) {
        this.person = person;
    }

    @Override
    public void show() {
        // TODO 重写父类的show方法
        if(person != null) {
            person.show();
        }
        
    }
    
    
}

接下来,我们便可以以装饰类为模板,创建各种各样的具体的装饰了,如衣服,裤子,鞋子等:

package com.lin.Decorator;

/**
 * TShirt 装扮
 * @author lin
 *
 */
public class TShirt extends Decorator {

    @Override
    public void show() {
        // TODO 重写父类show方法,增加新功能,穿TShirt
        System.out.print("大TShirt ");
        super.show();
    }
    
}
package com.lin.Decorator;

/**
 * TShirt 装扮
 * @author lin
 *
 */
public class TShirt extends Decorator {

    @Override
    public void show() {
        // TODO 重写父类show方法,增加新功能,穿TShirt
        System.out.print("大TShirt ");
        super.show();
    }
    
}
package com.lin.Decorator;

/**
 * TShirt 装扮
 * @author lin
 *
 */
public class Trouser extends Decorator {

    @Override
    public void show() {
        // TODO 重写父类show方法,增加新功能,穿裤子
        System.out.print("裤子 ");
        super.show();
    }
    
}

最后,我们开始进行组装:

package com.lin.Decorator;

public class AddDecorator {

    public static void main(String[] args) {
        // TODO 给人装饰
        Person person = new Person("张三");
        
        //穿球鞋
        Sneker sneker = new Sneker();
        sneker.decorate(person);
        
        //穿TShirt
        TShirt tShirt = new TShirt();
        tShirt.decorate(sneker);
        
        //穿裤子
        Trouser trouser = new Trouser();
        trouser.decorate(tShirt);
        
        trouser.show();

    }

}

结果:

 

我们可以发现:这一条流程下来,我们没有改变person,但却增加了新东西,甚至,这些装饰可以调换位置,随时拆卸与增加。

装饰者模式,适合对已经存在的类进行功能性的扩展,当然,如果有接口,那么用接口实现会更好。

 

posted on 2017-04-21 17:36  一只野生程序猿  阅读(122)  评论(0)    收藏  举报

导航