#大话设计模式之装饰者模式#

  现在有一个需求:设计一个QQ秀,可以随意搭配服饰。

  直接将上代码~~~

父类的父类Person(为什么需要父类的父类:乍看父父类其实是可有可无的,但如果删掉,你会发现父类Finery的decorate无法放装饰者)

package DecoratorPattern;

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

父类Finery

package DecoratorPattern;

public class Finery extends Person{
    
    protected Person component;
    public void Decorate(Person component){
        this.component = component;
    }
    @Override
    public void Show() {
        if(component != null){
            component.Show();
        }
    }
    
}

子类FinerySon

class TShirts extends Finery{

    @Override
    public void Show() {
        // TODO Auto-generated method stub
        System.out.println("大Tshirt");
        super.Show();
    }


    
}
class BigTrouser extends Finery{

    @Override
    public void Show() {
        // TODO Auto-generated method stub
        System.out.println("垮裤");
        super.Show();
    }
    
}
class Shoes extends Finery{

    @Override
    public void Show() {
        // TODO Auto-generated method stub
        System.out.println("鞋子");
        super.Show();
    }
    
}

界面代码(decorater()和Show()两个方法是设计者模式的精髓,首先说一下decorator(),ts调用decorator方法,我们知道ts本身是没有这个方法的,都是从父类Finery里面调用,在这个方法里面,xc对象作为参数赋值给了父父类Person,这是为后面的show()作铺垫,如果不理解,先看后面,之后同理,bt,st都让前一个对象作为参数赋值给了父父类,我猜你可能会疑惑,为什么要让Person这个对象被“重置”了这么多次呢,有什么用呢,我们再看下去就知道了,关键的show()出来了,st调用show()我们可以点进去看看过程是怎么实现,首先输出'“鞋子”,然后调用了super.show(),st的super是Finery,Finery调用show是调用Person的show(),而Person正式被装饰了,被bt赋值了!!所以,其实super.show()调用的是bt的show,所以再输出“垮裤”,然后执行bt.show()的super.show(),调用了Tshirt的show... ... )

package DecoratorPattern;

public class Main {
    public static void main(String[] args) {
        Person xc = new Person("小菜");
        System.out.println("第一种装扮");
        
        Finery ts = new TShirts();
        Finery bt = new BigTrouser();
        Finery st = new Shoes();
        
        ts.Decorate(xc);
        bt.Decorate(ts);
        st.Decorate(bt);
        st.Show();
        
    }
}

结果: 

说一下装饰者模式的用优点吧:首先他符合开放封闭原则,当你需要添加装饰类的时候(帽子,裤子之类)不需要对本身已经结构严谨的代码进行“破坏”,其次

什么时候使用装饰者模式:当我们需要往原系统添加新功能的时候,新功能往往只起到了装饰原系统的核心功能~~另外客户可以按顺兴地包装对象了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值