设计模式5---装饰模式

  问题:人要穿衣服,可以穿鞋子,裤子,领带。。。,顺序可以使随机的。

  也就是包含大量随机的操作,但是我们的结果却需要一个明确的顺序去执行这个方法。

  UML图:

该方法的变种是,可以Decorate直接继承自RealComponent。

上图的方法可以通过接口来操作,符合开闭原则。

这样所有实现component接口的类都可以使用Decorate类处理。

 已穿衣服为例:

component接口:

public interface IComponent {
    void show();
}

具体实现类:

public class Person implements IComponent {
    
    private String name;
    
    public Person(String name)
    {
        this.name = name;
    }
    @Override
    public void show() {
        System.out.println("穿衣服的"+name);
    }

}

装饰抽象类:

public abstract class Chothes implements IComponent {
    protected IComponent _mComponent = null;
    
    public void show()
    {
        if(_mComponent!=null)
        {
            _mComponent.show();
        }
    }
    
    public void decorate(IComponent comp)
    {
        _mComponent = comp;
    }
}

通过decorate方法,可以把其他Chothes 的子类传入。

Chothes装饰功能类:

public class Westernstyleclothes extends Chothes {
    
    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.print("西装\t");
        super.show();
    }

}

 

public class Tie extends Chothes {

    /* (non-Javadoc)
     * @see com.jayfulmath.designpattern.decorate.Chothes#show()
     */
    @Override
    public void show() {
        System.out.print("领带\t");
        super.show();
    }
    
}
public class Pants extends Chothes {

    /* (non-Javadoc)
     * @see com.jayfulmath.designpattern.decorate.Chothes#show()
     */
    @Override
    public void show() {
        System.out.print("西裤\t");
        super.show();
    }
    
}
public class LeatherShoes extends Chothes {

    /* (non-Javadoc)
     * @see com.jayfulmath.designpattern.decorate.Chothes#show()
     */
    @Override
    public void show() {
        System.out.print("皮鞋\t");
        super.show();
    }
    
}

main函数:

public class DecorateMain extends BasicExample {

    @Override
    public void startDemo() {
        Person mPerson = new Person("小明");
        
        Westernstyleclothes wl = new Westernstyleclothes();
        Pants pt = new Pants();
        Tie ti = new Tie();
        LeatherShoes ls = new LeatherShoes();
        
        ti.decorate(mPerson);
        ls.decorate(ti);
        pt.decorate(ls);
        wl.decorate(pt);
        
        wl.show();
    }

}

 

如上,可以任意更换顺序,但不需改变其他代码,即可实现穿衣服流程的变化。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值