当需要在一个基类添加新功能时候可以考虑装饰模式,比如给机器猫上添加一些新功能,软件升级需要新功能
动态的为一个对象添加新的功能。装饰模式是一种用于代替继承的技术,无需通过继承就能扩展对象的新功能
使用对象的关联关系代替继承关系,避免类型体系的快速膨胀。
下面以机器猫为例进行演示:UML图如下:
1:创建一个猫的接口规定一些机器猫的共同行为:
ICat.java
public interface ICat{
public void move();
class Cat implements ICat{
public void move(){
System.out.pritnln("机器猫跑!");
}
class CatDecorator implements ICat{
//持有真实对象的引用
private ICat cat;
public CatDecorator(ICat cat){
this.cat = cat;
}
public void move(){
cat.move();
}
}
}
class SkipCat extends CatDecorator{
public SkipCat(ICat cat){
super(cat);
}
public void move(){
super.move();
System.out.println("机器猫跳!");
}
}
class ClimbCat extends CatDecorator{
public ClimbCat(ICat cat){
super(cat);
}
public void move(){
super.move();
System.out.println("机器猫爬树!");
}
}
}
2:创建客户端程序:Client.java
public class Client{
public static void main(String[] args){
//创建一个真实对象
Cat cat = new Cat();
//创建一个升级版的对象
SkipCat sc = new SkipCat(cat);
sc.move();
//创建另外一个升级版还是以cat为基类进行扩展
ClimbCat cc = new ClimbCat(cat);
cc.move();
//这一次以SkipCat为基类
ClimbCat cs = new ClimbCat(sc);
//集成了SkipCat和ClimbCat的所有特性
cs.move();
}
}