感觉装饰者模式挺实用的,它可以在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,跟名字一样,名副其实的装饰者。
装饰对象特点:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
不多说 直接上代码。
比如说,现在有一群学生,我们要以不同的母语把他们分开来,例如ChineseStu,EnglishStu,JapaneseStu。
1 //接口 2 interface Student { 3 public void speak(); 4 } 5 6 //中国学生 7 8 class ChineseStu implements Student{ 9 public void speak() { 10 System.out.println("你好!"); 11 } 12 } 13 14 //英国学生 15 16 class EnglishStu implements Student{ 17 public void speak() { 18 System.out.println("Hello!"); 19 } 20 } 21 22 //日本学生 23 24 class JapaneseStu implements Student{ 25 public void speak() { 26 System.out.println("こんにちは!"); 27 } 28 }
但是现在有了个新的问题,比如我们要在他们打招呼之后说一声他们各自来自于哪个学校,例如Aschool, Bschool怎么办?再写一个子类继承Stu们吗?不需要哦,这个时候就可以用装饰者模式来装饰啦,代码如下。
1 //装饰者 2 class AschoolStu implements Student { 3 private Student student; 4 AschoolStu(Student student) { //包含对真实对象的引用 5 this.student = student; 6 } 7 public void speak() { //有相同的接口 8 student.speak(); 9 System.out.println("Aschool student!"); //附加功能 10 } 11 } 12 13 //Aschool的中国学生打招呼 14 class Test { 15 public static void main(String args[]) { 16 ChineseStu cstu = new ChineseStu(); 17 AschoolStu acstu = new AschoolStu(cstu); 18 acstu.speak(); //"你好!\nAschool student!" 19 } 20 }
时间: 2024-10-14 01:01:07