装饰模式

装饰模式

装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加的灵活。


装饰模式的结构图

这里写图片描述
Component是一个接口,可以给对象动态的添加职责,功能。ConcreteComponent是定义了一个具体的对象。也可以给对象添加一些职责。Decorator,表示装饰类,继承了Component,从外类来扩展Conmponent类的功能,但是对于Component来说,是无需知道Decoratro的存在的,而ConcreteDecorator就是具体的装饰对象了。


装饰模式的使用

在我们日常的编码当中,可能并不会如图所示的结构。很可能是需要被装饰的对象是一个类如上图中的ConcreteComponent对象,而没有抽象的Component类或者接口,那么装饰类就可以是ConcreteComponent的子类。

例如我们有一个person类,类中有一个show方法,表示人的形象

public class Pserson{
    private String name;


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

    public void Show() {
        System.out.println();
    }


    public String getName() {
        return name;
    }

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

那么我们就可以创建一个人的装饰类集成person类,并且创建一个person成员,并且重写show方法,Decorate如下:

public class Decorate extends Pserson{
    private Pserson p  ;

    public void doDecorate(Pserson pserson) {
        this.p = pserson;
    }

    @Override
    public void Show() {
        if (p!=null){
            p.Show();
        }
    }
}

最后创建具体的装饰类,来装饰就可以了

public class TshirtDecorate extends Decorate {

    @Override
    public void Show() {
        say();
        super.Show();
    }

    public void say(){
        System.out.println("hello");
    }
}
public static void main(String[] args) {
        Pserson p = new Pserson("小菜菜");
        TshirtDecorate t = new TshirtDecorate();
        t.doDecorate(p);
        t.Show();
    }

同样的道理,如果只有一个ConcreteDecorator的话就没有必要创建一个单独的Decorator类了。

因为Decorator类的作用是用来完成Compont的功能的,让接下来的包装不用考虑compont的实现。

当只有一个具体的ConcreteDecorator时,就没有必要大费周折写Decorator了。直接讲decorator和concreteDecorator的责任和成一个类就可以了。

也就是直接集成person对象,然后创建一个person成员,重写集成的person方法,改成成员调用成员的person方法。并添加新功能。

public class TshirtDecorate extends Pserson {
    private Pserson p;

    public TshirtDecorate(Pserson p) {
        this.p = p;
    }

    @Override
    public void Show() {
        say();
        p.Show();
    }

    public void say(){
        System.out.println("hello");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值