装饰者模式的简单实现

   我们将人定义为一个抽象类,以人的穿衣的行为定义为一个抽象方法。
public abstract class Person {

    /*person下有一个穿着的抽象方法
    */
    public abstract void dressed();
}
   该类其实就是抽象组件类,也就是我们需要装饰的的原始对象,那么具体装饰谁呢?我们需要一个具体的实现类。
public class Boy extends Person {

    @Override
    public void dressed() {

//Boy类下dressed方法的基本逻辑

        System.out.println("穿了衣服");
    }
}
    Boy类继承于Person类,该类仅对Person中的dressed方法作了具体的实现,而Boy类则是我们所要装饰的具体对象,现在需要一个装饰者来装饰我们的这个Boy对象,这里定义一个PersonCloth来表示人所穿着的衣服。
public abstract class PersonCloth extends Person {

    protected Person mPerson;//保持一个Person类的引用

    public PersonCloth(Person mPerson) {

        this.mPerson = mPerson;
    }

    @Override
    public void dressed() {
        mPerson.dressed();
    }
}
PersonCloth类中我们保持了一个对Person类的引用, 可以方便的调用具体被装饰对象中的方法, 这也是为什么我们可以在不破坏原类层次结构的情况下为类增加一些功能,我们只需要在被装饰对象的相应方法前或后增加相应的功能逻辑即可,在装饰物只有一个的情况下,可不必声明一个抽象类作为装饰者抽象的提取,仅需要定义一个普通的类表示装饰者即可,这里为了表明示例我们定义两种衣服类型,一类ExpensiveCloth表示高档衣服.
public class ExpensiveCloth extends Personcloth {
	public ExpensiveCloth(Person person){
		super(person);
	}
	//穿短袖
	private void dressShirt(){
		System.out.println("穿件短袖");
	}
	//穿皮衣
	private void dressLeather(){
		System.out.println("穿件皮衣");
	}
	//穿牛仔裤
	private void dressJean(){
		System.out.println("穿件短袖");
	}
	@Override
	public void dressed(){
		dressShirt();
		dressLeather();
	}
}

//逻辑依旧很简单不再多说,而另一个类CheapCloh则表示便宜的衣服。

public class CheapCloth extends PersonCloth{
	public CheapCloth(Person person){
		super(person);
	}
	//穿短裤
	public void   dressShorts(){
		System.out.println("穿条题裤");
	}
	public void dressed(){
		super.dressed();
		dressShorts();
	}
}
这两个类本质上并没有什么区别,两者都是为Boy类中的dressed方法提供功能扩展,不过这种扩展并非是直接修改原有的方法逻辑或结构,更恰当地说,仅仅是在另一个类中将原有方法和新逻辑进行封装整合而已.最后我们来看看客户类中的调用.

public class Main{
	public static void main(String[] args){
		Person person = new Boy();
		PersonCloth clothCheap= new CheapCloth(person);
		clothCheap.dressed();
		PersonCloth clothExpensive= new ExpensiveCloth(person);
		clothExpensive.dressed();

	}
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值