设计模式之——装饰者模式

装饰模式可以动态的为类的方法更换(增强)功能。
假如有一个方法dress(),怎样可以改变其中的逻辑增加功能呢。
常见答案如下
继承,使用子类集成父类,然后override 方法dress()编写自己的逻辑

子类中的方法

@Override
public void dress(){
super.dress();
//自己的逻辑;
}


我们来说说继承的不足之处。首先继承是固定的,也就是说我有几个逻辑就需要继承出几个子类
这里我们借用《大话设计模式》里面的例子——穿衣服
穿衣服是一个搭配。
比如T恤衫牛仔裤,需要做一个类

public T_Pant extends SuperClass{
@Override
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
}
}


又一种搭配呢?T恤衫 牛仔裤 大墨镜

public T_Pant_Glass extends SuperClass{
@Override
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
System.out.println("大墨镜")
}
}


这样似乎不太好,因为有可以复用的代码。有人说,那我把T_Pant_Glass继承自T_Pant 这样可以复用一部分代码

public T_Pant_Glass extends T_Pant{
@Override
public void dress(){
super.dress();
System.out.println("大墨镜");
}
}

这样好多了,但是要知道人的服装搭配是复杂多变的,如果要穷举出所有的搭配,并对每个搭配制作一个类,这是多么困难的事情。更进一步说,由于服装的搭配在变化,经常需要重构代码,比如上面的例子把“体恤衫牛仔裤大墨镜”类重构了。这样的工作是不是很让人崩溃。

那么怎么办,我们的需求是可以动态的组合这些服饰,想怎么搭配就怎么搭配,而不需要为每个搭配制作新的类。
那么我们对每个服饰做一个类,因为无论如何调整,每一种衣服是穿着搭配的最小单位。

[size=large]装饰模式开始[/size]
1、做一个穿衣服的人的类

public class Person{
protected Person person;
public void dress(){
//什么也不做,因为没有衣服穿
}
}


2、做一个T恤衫类,是Person的子类,这个有点费解,因为不合乎常理,衣服并非是人的子类对吧,这个例子不太恰当,先凑合看,看明白意思就行

public class TShirt extends Person{
public void dress(){
public TShirt(Person p){
this.person = p;
}
System.out.println("穿体恤衫");
super.dress();
}
}

同理做裤子类,墨镜类

public class Pant extends Person{
public void dress(){
public Pant(Person p){
this.person = p;
}
System.out.println("穿裤子");
super.dress();
}
}



public class Glass extends Person{
public void dress(){
public Glass(Person p){
this.person = p;
}
System.out.println("戴墨镜");
super.dress();
}
}


然后呢,我们在客户端把他们串起来,也就是穿起来


main()
{
Person p= new TShirt(new Pant(new Glass(new Person())));
p.dress();
}


这样我们只要更改main函数中的第一句,就可以动态的调整穿什么衣服和穿衣的顺序了。

这个例子的执行顺序是

穿体恤衫
穿裤子
戴墨镜

你们可以试着改变一下顺序哦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值