首页 > 代码库 > java中基本的装饰者模式
java中基本的装饰者模式
感觉装饰者模式挺实用的,它可以在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,跟名字一样,名副其实的装饰者。
装饰对象特点:
(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 }
java中基本的装饰者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。