------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
到这里可以发现,如果我们继承Person类同样可以实现该功能,为何要用装饰设计模式呢?
想要对已有的对象进行功能的增强时
可以定义类,将已有对象传入,基于已有的功能,提供加强功能
那么自定义的这个类就被称之为装饰类
举个简单的例子:
/**
* 装饰类示例
* @author Shawn·Zhang
*/
class Person{
public void eat() {
System.out.println("吃饭");
}
}
//要求:增强吃饭方法,并且不能改变原有代码
//分析:这时,我们需要定义一个类,来增强,也就是对之前Person类进行修饰
//我们新建一个SuperPerson类进行装饰
class SuperPerson{//装饰类
private Person p;
public SuperPerson(Person p) {//有参构造方法,参数为被装饰对象
this.p = p;
}
public void superEat(){
System.out.println("开胃酒");
p.eat();
System.out.println("餐后甜点");
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
SuperPerson sp = new SuperPerson(p);
sp.superEat();
}
}
到这里可以发现,如果我们继承Person类同样可以实现该功能,为何要用装饰设计模式呢?
这也就引入了装饰设计模式对比继承的优势了
可以看到,装饰是创建有参构造函数,通过参数的传递来实现功能的增强
而继承,则是为了增强功能而重新创建一个子类,这样会使得整个体系变得臃肿
装饰类相比继承,保持了灵活性强及扩展性强等特点,并且减少了类和类之间的联系,也避免了体系的臃肿
下面引入一个现实生活中的案例,以便理解:
例如一辆汽车,在满足基本的功能上面,假如你需要增加某些功能,只需要增加即可,而不需要将汽车拆了重新组装,这样的例子就能很好的说明装饰设计模式的好处
/**
* 包装设计模式
* 汽车
* |--桑塔纳
* |--倒车影像
* |--索纳塔
* |--自动泊车
*
* 装饰模式后
* 汽车
* |--桑塔纳
* |--索纳塔
* |--倒车影像
* |--自动泊车
* @author Shawn·Zhang
*
*/
abstract class Car{//抽象类
abstract void show();
}
class Santana extends Car{
@Override
public void show() {
System.out.println("桑塔纳");
}
}
class Sonata extends Car{
@Override
void show() {
System.out.println("索纳塔");
}
}
class RadarCar{
private Car car;
public RadarCar(Car car) {
this.car = car;
}
public void show(){
car.show();
System.out.println("具有倒车影像功能");
}
}
public class MyCar {
public static void main(String[] args) {
Car car = new Santana();
System.out.println("-------------------包装前-------------------");
car.show();
RadarCar rcar = new RadarCar(car);
System.out.println("-------------------包装后-------------------");
rcar.show();
}
}
PS:自动泊车和倒车影像同理,代码中没有写明。