Java 设计模式 - 装饰模式

Java 设计模式 - 装饰模式

看了大话设计模式此章节多遍才稍微有点理解,特此记录。
深入浅出,通俗易懂。

情景:
小菜要去见未来女友 娇娇,来个服装打扮的设计。
第一弹:

这里写图片描述

客户端代码:
public static void main(String[] args){
小菜 xiaocai = new 小菜();
xiaocai.穿T恤();
xiaocai.穿垮裤();
xiaocai.穿破球鞋();
xiaocai.穿西装();
//…….
}

问题来了,
娇娇喜欢超人,小菜这次想穿的是超人,咋办? 直接修改小菜的类吗? 这就违背了开闭原则。
解决办法:
把装扮的东西抽象出来,小菜需要啥衣服,就实例化对应的装扮即可。

这里写图片描述

public static void main(String[] args){
人 小菜 = new 人();
T恤 t恤 = new T恤();
垮裤 kuaku = new 垮裤();
西装 xizhuang = new 西装();
Tie tie = new Tie();
t恤.show();
kuaku.show();
xizhuang.show();
tie.show();
//…….
}

问题又来了,
整个配置过程大家伙都可以看到,并且顺序也固定了,先穿这个再穿那个;如何配置过程隐藏起来,顺序也能灵活。
解决办法:
这里写图片描述
简化版的装饰模式
// ConcreteComponent
public class Person {

private String name;

public Person(){}

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

public void show(){
    System.out.println("装扮的"+name);
}

}

//Decorater
public class Finery extends Person {

protected Person component;

//打扮
public void Decorate(Person component){
    this.component = component;
}

@Override
public void show() {
    // TODO Auto-generated method stub

    if(null != component){
        component.show();
    }
}

}

// ConcreteDecorator
public class Tshirts extends Finery {

@Override
public void show() {
    // TODO Auto-generated method stub

    System.out.println("大T恤");
    super.show();
}

}

public class BigTrouser extends Finery {

@Override
public void show() {
    // TODO Auto-generated method stub

    System.out.println("垮裤");
    super.show();
}

}

// 客户端代码
public static void main(String[] args) {

    Person xc = new Person("小菜");
    Tshirts dtx = new Tshirts();
    BigTrouser kk = new BigTrouser();

    dtx.Decorate(xc);
    kk.Decorate(dtx);
    kk.show();
}

总结:
装饰模式:有效地把类中的核心职责和装饰功能区分开,去除相关类中重复的装饰逻辑,简化原有的类;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值