将一个对象作为参数进行传递,然后对这个对象进行包装---改变其中的方法或者添加一些新的行为---装饰设计模式---装饰者模式---Decorate Model
改变一个方法:
1. 通过继承这个类,然后重写其中的方法
2. 通过对象的传递创建装饰对象,在装饰类中重新提供对应的方法
继承的缺点:
1. 单继承
2. 利用向上造型创建了一个父类对象,可以调用子类中重写方法,不能在使用父类中原来的方法
3. 如果父类对象已经存在,不能使用子类中重写之后的方法
装饰设计模式的缺点:
可能提高代码的冗余度---代理模式
如果需要对已有对象上的方法进行改造, 可以定义类将被装饰者传入, 基于已有的功能, 添加更强的功能
那么这个自定义的类就是装饰类. 装饰类通常会提供构造函数将被装饰者传入, 并保存在类的内部, 基于已有对象上的功能, 添加更强的功能
实现步骤:
a) 定义装饰类, 装饰类要求和被装饰者所属的类实现相同的接口或者是继承相同的类
b) 在装饰类中, 通过构造方法将被装饰者传入, 保存在类的内部
c) 对于不想改造的方法, 直接调用已有对象上的方法, 对于想要改造的方法进行改造
1 //人的接口 2 public interface Person { 3 4 void eat(); 5 6 void sleep(); 7 8 } 9 10 11 //明星的实现类 12 public class Star implements Person { 13 14 @SuppressWarnings("unused") 15 private Person p; 16 17 public Star(Person p) { 18 this.p = p; 19 } 20 21 @Override 22 public void eat() { 23 System.out.println("明星吃的是野菜~~~"); 24 } 25 26 @Override 27 public void sleep() { 28 System.out.println("上床数星星~~~"); 29 } 30 31 } 32 33 //工人实现类 34 public class Worker implements Person { 35 36 @Override 37 public void eat() { 38 System.out.println("工人吃一顿山珍海味~~~然后吃一个月的土~~~"); 39 } 40 41 @Override 42 public void sleep() { 43 System.out.println("上床数星星~~~"); 44 } 45 46 } 47 48 //将工人进行包装变成明星,但本质上工人还是工人 49 public class PersonDemo { 50 51 public static void main(String[] args) { 52 53 Worker p = new Worker(); 54 55 p.eat(); 56 57 Star s = new Star(p); 58 59 s.eat(); 60 61 p.eat(); 62 63 } 64 65 }