我们将人定义为一个抽象类,以人的穿衣的行为定义为一个抽象方法。
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();
}
}