设计模式学习笔记(二)之观察者模式、装饰者模式
观察者模式的简单理解:
多个观察者时刻关注主题的动态,主题一旦有变化及时反馈。
实现:
抽象观察者:
抽象类声明一个方法:对主题的变化做出反馈。
1 public abstract class Observer { 2 3 public abstract void Update(); 4 5 }
抽象主题:
一个字段:抽象观察者的集合。一个主题对应多个观察者,是一对多的一种体现。
三个方法:addObserver(添加观察者),delObserver(删除观察者)。
Notify(唤醒观察者):提醒观察者已经发生变化。遍历集合里的所有观察者,使每个观察者做出反馈。
1 public abstract class Subject { 2 3 private List<Observer> list=new ArrayList<Observer>(); 4 5 public void addObserver(Observer observer){ 6 list.add(observer); 7 } 8 public void delObserver(Observer observer){ 9 list.remove(observer); 10 } 11 public void Notify(){ 12 for(Observer o:list){ 13 14 o.Update(); 15 } 16 } 17 }
具体主题:
一个字段:主题的当前状态。
1 public class ConcreteSubject extends Subject { 2 3 private String subjectState; 4 5 public void setSubjectState(String subjectState){ 6 7 this.subjectState=subjectState; 8 } 9 public String getSubjectState(){ 10 return subjectState; 11 } 12 }
具体观察者:
Update方法:对主题的变化做出反馈的具体实现。
1 public class ConcreteObserver extends Observer{ 2 3 private String observerState; 4 private String name; 5 private ConcreteSubject subject; 6 7 public ConcreteObserver(ConcreteSubject subject,String name){ 8 this.subject=subject; 9 this.name=name; 10 } 11 12 public ConcreteSubject getSubject() { 13 return subject; 14 } 15 16 public void setSubject(ConcreteSubject subject) { 17 this.subject = subject; 18 } 19 20 @Override 21 public void Update() { 22 // TODO Auto-generated method stub 23 observerState=subject.getSubjectState(); 24 System.out.println("The observer's state of "+name+" is "+ observerState); 25 26 } 27 28 }
测试类:
1 public class Test { 2 public static void main(String[] args) { 3 ConcreteSubject subject=new ConcreteSubject(); 4 subject.addObserver(new ConcreteObserver(subject, "Observer A")); 5 subject.addObserver(new ConcreteObserver(subject, "Observer B")); 6 subject.addObserver(new ConcreteObserver(subject, "Observer C")); 7 8 9 subject.setSubjectState("Ready"); 10 subject.Notify(); 11 12 13 subject.setSubjectState("Start"); 14 subject.Notify(); 15 } 16 17 }
输出:
The observer's state of Observer A is Ready The observer's state of Observer B is Ready The observer's state of Observer C is Ready The observer's state of Observer A is Start The observer's state of Observer B is Start The observer's state of Observer C is Start
装饰者模式的简单理解:
动态的给一个对象增加一些装饰,使其拥有更多功能或属性。
实现:
抽象类Girl:被装饰者的父类,拥有Girl的属性和一个描述Girl的方法。
1 public abstract class Girl { 2 3 public String description="no particular"; 4 5 public String getDescription(){ 6 7 8 return description; 9 } 10 11 12 }
被装饰者:中国Girl,美国Girl.为Girl添加属性,定义特定类型Girl。
1 public class ChineseGirl extends Girl { 2 3 public ChineseGirl(){ 4 super.description="Chinese Girl"; 5 } 6 } 7 8 public class AmericanGirl extends Girl{ 9 10 public AmericanGirl(){ 11 12 super.description="American Girl"; 13 14 } 15 }
装饰者(抽象):继承Girl类的描述方法,并把该方法承接给自己的子类(装饰者)。
装饰者与被装饰者拥有共同的超类(Girl)
1 public abstract class GirlDecorator extends Girl { 2 3 public abstract String getDescription(); 4 5 }
装饰者:为特定类型Girl添加描述。
1 public class Art extends GirlDecorator{ 2 private Girl girl; 3 public Art(Girl girl){ 4 this.girl=girl; 5 } 6 @Override 7 public String getDescription() { 8 // TODO Auto-generated method stub 9 return this.girl.getDescription()+"+like Art"; 10 } 11 public void draw(){ 12 System.out.println("draw pictures!"); 13 } 14 } 15 16 17 public class Music extends GirlDecorator{ 18 private Girl girl; 19 public Music(Girl girl){ 20 this.girl=girl; 21 } 22 @Override 23 public String getDescription() { 24 // TODO Auto-generated method stub 25 return this.girl.getDescription()+"+like Music"; 26 } 27 public void Singing(){ 28 System.out.println("Singing Music"); 29 } 30 }
测试类:
1 public class Test { 2 3 public static void main(String[] args) { 4 5 Girl g1=new AmericanGirl(); 6 7 System.out.println(g1.getDescription()); 8 9 Art g2=new Art(g1); 10 System.out.println(g2.getDescription()); 11 12 Music g3=new Music(g2); 13 System.out.println(g3.getDescription()); 14 15 } 16 }
输出:
American Girl
American Girl+like Art
American Girl+like Art+like Music