设计模式-装饰模式

d

1.定义

装饰模式(Decorator),动态地给一份对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。(摘自《大话设计模式》第6章)

2.代码

大概思路是:1)被装饰的对象

2)确定被装饰的对象,和需要装饰的动作

3)具体装饰

person这个类就是需要被装饰的对象,person需要衣服装饰

/**************************************************************
 *<P>简要描述:作为被修饰的对象</P>
 ******************************************************************/
public class Person {
    private String name;

    public Person() { }

    public Person(String name) {
        this.name = name;
    }

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

    public void show() {
        System.out.println(name);
    }
}

Finery 有两个地方需要关注:person变量和show()方法。person就是确定的被装饰对象,show()方法就是用来装饰的动作。

/**************************************************************
 *<P>简要描述:1.确定被修饰的对象
 *             2.定义修饰的动作</P>
 ******************************************************************/
public class Finery extends Person{
    private Person component; //被修饰的对象

    public void decorate(Person component) {
        this.component = component;
    }

    /**
     * 修饰的动作
     */
    public void show(){
        if (component != null)
            component.show();
    }
}

具体装饰过程(注意继承的类都是finery这个类,因为finery类确定了修饰对象和动作也相当于把动作和对象关联起来):

给人穿上上衣

public class Jacket extends Finery{
    

    @Override
    public void show(){
        super.show();
        System.out.println("穿上外套");
    }
}

给人穿上裤子

public class Trousers extends Finery{
    @Override
    public void show() {
        super.show();
        System.out.println("穿上裤子");
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        Person person = new Person("小明"); //要被修饰的对象
        Jacket j = new Jacket();            //修饰的动作,穿上衣
        Trousers trousers = new Trousers(); //修饰的动作,穿裤子

        j.decorate(person);  //修饰过程
        trousers.decorate(j);//修饰过程
        trousers.show();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值