1.装饰模式
一般有两种方式可以实现给一个类或对象增加行为: - 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系要创建更多的对象。
2.实例
变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。
项目结构图如下:


定义变形接口
public interface Transform {
void move();
}
定义汽车类
public class Car implements Transform {
public Car(){
System.out.println("变形金刚是一辆车");
}
@Override
public void move() {
System.out.println("在陆地上移动");
}
}
定义变形者类
public class Changer implements Transform {
private Transform transform;
public Changer(Transform transform){
this.transform=transform;
}
@Override
public void move() {
this.transform.move();
}
}
定义机器人和飞机类
//Robot.java
public class Robot extends Changer{
public Robot(Transform transform) {
super(transform);
System.out.println("变成机器人");
}
public void say(){
System.out.println("机器人说话!");
}
}
//AirPlane.java
public class AirPlane extends Changer {
public AirPlane(Transform transform) {
super(transform);
System.out.println("变成飞机了");
}
public void fly(){
System.out.println("在天空飞翔!");
}
}
测试类
public class TestDecorationDemo01 {
public static void main(String[] args) {
Transform transform=new Car();
transform.move();
System.out.println("===============");
AirPlane airPlane=new AirPlane(transform);
airPlane.move();
airPlane.fly();
}
}
运行结果:
变形金刚是一辆车
在陆地上移动
===============
变成飞机了
在陆地上移动
在天空飞翔!