设计模式——装饰器模式

应用场景

在现有的代码中增加或者删除一些功能,同时对现有的代码结构不会造成影响,同时不会添加子类。如果用继承的方式来拓展一个类的功能,因为继承具有静态特征,耦合度高,并且如果用继承,会使子类膨胀。而装饰器的目标就是:使用组合关系来创建一个包装对象来对真实对象进行修饰,从而在保证子结构不变的前提下,为真实对象提供额外的功能。

UML图

在这里插入图片描述

优点

  1. 采用装饰器模式来拓展对象的功能比采用继承方式更加灵活
  2. 可以设计出不同的具体装饰类,创造出多个不同行为的组合

缺点

装饰器增加了很多子类,会使程序变复杂

代码实现

interface People

public interface People {
    public void diaplay();
}

man.class

public class man implements People{

    @Override
    public void diaplay() {
        System.out.println("我是男生,我要准备出门了");
    }
}

woman.class

public class woman implements People {
    @Override
    public void diaplay() {
        System.out.println("我是女生,我要准备出门了");
    }
}

Decorator.class

public class Decorator implements People {
    People p;

    public Decorator(People p) {
        this.p = p;
    }


    @Override
    public void diaplay() {
        p.diaplay();
    }
}

ConcreteDecoratorOne.class

public class ConcreteDecoratorOne extends Decorator{
    public ConcreteDecoratorOne(People p1) {
        super(p1);
    }

    @Override
    public void diaplay() {
        super.diaplay();
        addFunction();
    }

    public void addFunction(){
        System.out.println("准备出门,拿好出门所需东西");
    }
}

ConcreteDecoratorTwo.class

public class ConcreteDecoratorTwo extends Decorator {
    public ConcreteDecoratorTwo(People p1) {
        super(p1);
    }
    @Override
    public void diaplay() {
        super.diaplay();
        addFunction();
    }

    public void addFunction(){
        System.out.println("要出门了,得先化个妆");
    }
}

Test.class

public class Test {
    public static void main(String[] args) {
        People p1 = new man();
        People p2 = new woman();
        System.out.println("===========装饰之前============");
        p1.diaplay();
        p2.diaplay();
        System.out.println("===========装饰之后============");
        Decorator D1 = new ConcreteDecoratorOne(p1);
        Decorator D2 = new ConcreteDecoratorTwo(p2);
        D1.diaplay();
        D2.diaplay();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值