Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1783019
  • 博文数量: 297
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 3006
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-06 22:04
个人简介

Linuxer, ex IBMer. GNU https://hmchzb19.github.io/

文章分类

全部博文(297)

文章存档

2020年(11)

2019年(15)

2018年(43)

2017年(79)

2016年(79)

2015年(58)

2014年(1)

2013年(8)

2012年(3)

分类: Java

2017-01-29 15:56:25

王银批评Gang Of 4 和他们搞出来的Design pattern, 迷信design pattern 是没用的,看看还是可以的。
Java 确实是复杂的玩意,写起来太复杂了,看代码又找不到真正干活的代码在哪里,缺少了多重继承,搞出来一个interface. 

any way ,贴一个design pattern, 印度人写的 出自Java Design Patterns 一书.

1个observer 对应 1个subject 

点击(此处)折叠或打开

  1. package ObserverPattern;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. class Observer{
  5.     public void update(){
  6.         System.out.println("flag value changed in Subject");
  7.     }
  8. }

  9. interface ISubject{
  10.     void register(Observer o);
  11.     void unregister(Observer o);
  12.     void notifyObservers();
  13. }

  14. class Subject implements ISubject {
  15.     List<Observer> observerList=new ArrayList<Observer>();
  16.     private int _flag;

  17.     public int getFlag(){
  18.         return _flag;
  19.     }

  20.     public void setFlag(int _flag){
  21.         this._flag=_flag;
  22.         //flag value changed, so notify observer(s)
  23.         notifyObservers();
  24.         }

  25.     @Override
  26.     public void register(Observer o){
  27.         observerList.add(o);
  28.     }

  29.     @Override
  30.     public void unregister(Observer o){
  31.         observerList.remove(o);
  32.     }

  33.     @Override
  34.     public void notifyObservers(){
  35.         for(int i=0;i<observerList.size();i++){
  36.             observerList.get(i).update();
  37.         }
  38.     }
  39. }

  40. class ObserverPatternEX{
  41.     public static void main(String[] args){
  42.         System.out.println("****Observer pattern Demo***");
  43.         Observer o1=new Observer();
  44.         Subject sub1=new Subject();

  45.         sub1.register(o1);
  46.         System.out.println("Setting flag = 5");
  47.         sub1.setFlag(5);
  48.         System.out.println("Setting flag = 125");
  49.         sub1.setFlag(125);
  50.         sub1.unregister(o1);
  51.         //No notification this time to o1, since it is unregistered
  52.         System.out.println("Setting flag=50");
  53.         sub1.setFlag(50);
  54.     }
  55.     }
对个Observer对应一个subject 

点击(此处)折叠或打开

  1. package ObserverPattern2;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. interface IObserver{
  5.     void update(int i);
  6. }

  7. class Observer1 implements IObserver{
  8.     @Override
  9.     public void update(int i){
  10.         System.out.println("Observer1: myValue in Subject is now: "+i);
  11.     }
  12. }

  13. class Observer2 implements IObserver{
  14.     @Override
  15.     public void update(int i){
  16.         System.out.println("Observer2: observers->myValue is changed in Subject to: "+i);
  17.     }
  18. }

  19. interface ISubject{
  20.     void register(IObserver o);
  21.     void unregister(IObserver o);
  22.     void notifyObservers(int i);
  23. }


  24. class Subject implements ISubject{
  25.     private int myValue;
  26.     List<IObserver> observersList = new ArrayList<IObserver>();

  27.     public int getMyValue() {
  28.         return myValue;
  29.     }

  30.     public void setMyValue(int myValue) {
  31.         this.myValue = myValue;
  32.         notifyObservers(myValue);
  33.     }

  34.     @Override
  35.     public void register(IObserver o){
  36.         observersList.add(o);
  37.     }

  38.     @Override
  39.     public void unregister(IObserver o){
  40.         observersList.remove(o);
  41.     }

  42.     @Override
  43.     public void notifyObservers(int updatedValue){
  44.         for(int i=0;i<observersList.size();i++){
  45.             observersList.get(i).update(updatedValue);
  46.         }
  47.     }
  48. }

  49. class ObserverPatternModified{
  50.     public static void main(String[] args){
  51.         System.out.println("Modified Observer Pattern Demo");
  52.         Subject sub = new Subject();
  53.         Observer1 ob1 = new Observer1();
  54.         Observer2 ob2 = new Observer2();

  55.         sub.register(ob1);
  56.         sub.register(ob2);

  57.         sub.setMyValue(5);
  58.         System.out.println();
  59.         sub.setMyValue(25);
  60.         System.out.println();

  61.         //unregister ob1 only
  62.         sub.unregister(ob1);
  63.         //Now only ob2 will observer the change
  64.         sub.setMyValue(100);

  65.     }
  66. }

最后是多个observer 对应多个subject 

点击(此处)折叠或打开

  1. package ObserverPattern3;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. interface IObserver{
  5.     void update(String s, int i);
  6. }

  7. class Observer1 implements IObserver{

  8.     @Override
  9.     public void update(String s, int i){
  10.         System.out.println("Observer1: myValue "+s+" is now: "+i);

  11.     }
  12. }

  13. class Observer2 implements IObserver{

  14.     @Override
  15.     public void update(String s, int i){
  16.         System.out.println("Observer2: ->myValue is changing in "+s+" to : "+i);
  17.     }
  18. }

  19. class Observer3 implements IObserver{

  20.     @Override
  21.     public void update(String s, int i){
  22.         System.out.println("Observer3 is observing: myValue is changed in "+s+" to : "+i);
  23.     }
  24. }

  25. interface ISubject{
  26.     void register(IObserver o);
  27.     void unregister(IObserver o);
  28.     void notifyObservers(int i);
  29. }

  30. class Subject1 implements ISubject{
  31.     private int myValue;
  32.     List<IObserver> observersList=new ArrayList<IObserver>();

  33.     public int getMyValue(){
  34.         return myValue;
  35.     }

  36.     public void setMyValue(int myValue){
  37.         this.myValue=myValue;
  38.         notifyObservers(myValue);
  39.     }

  40.     @Override
  41.     public void register(IObserver o){
  42.         observersList.add(o);
  43.     }

  44.     @Override
  45.     public void unregister(IObserver o){
  46.         observersList.remove(o);
  47.     }

  48.     @Override
  49.     public void notifyObservers(int updatedValue){
  50.         for(int i=0;i<observersList.size();i++){
  51.             observersList.get(i).update(this.getClass().getSimpleName(), updatedValue);
  52.         }
  53.     }
  54. }

  55. class Subject2 implements ISubject{
  56.     private int myValue;
  57.     List<IObserver> observersList=new ArrayList<IObserver>();

  58.     public int getMyValue(){
  59.         return myValue;
  60.     }

  61.     public void setMyValue(int myValue){
  62.         this.myValue=myValue;
  63.         notifyObservers(myValue);
  64.     }

  65.     @Override
  66.     public void register(IObserver o){
  67.         observersList.add(o);
  68.     }

  69.     @Override
  70.     public void unregister(IObserver o){
  71.         observersList.remove(o);
  72.     }

  73.     @Override
  74.     public void notifyObservers(int updatedValue){
  75.         for(int i=0;i<observersList.size();i++){
  76.             observersList.get(i).update(this.getClass().getSimpleName(), updatedValue);
  77.         }
  78.     }

  79. }

  80. class ObserverPatternEX3 {
  81.     public static void main(String[] args){
  82.         System.out.println("*** Observer Pattern Demo3***\n");
  83.         Subject1 sub1 = new Subject1();
  84.         Subject2 sub2 = new Subject2();

  85.         Observer1 ob1 = new Observer1();
  86.         Observer2 ob2 = new Observer2();
  87.         Observer3 ob3 = new Observer3();

  88.         //Observer1 and Observer2 registers to //subject 1
  89.         sub1.register(ob1);
  90.         sub1.register(ob2);

  91.         //Observer2 and Observer3 registers to //subject 2
  92.         sub2.register(ob2);
  93.         sub2.register(ob3);

  94.         //set new value to subject 1
  95.         //observer1 and observer2 get //notification
  96.         sub1.setMyValue(50);
  97.         System.out.println();
  98.         //Set new value to Subject 2
  99.         //Observer2 and Observer3 get //notification
  100.         sub2.setMyValue(250);
  101.         System.out.println();
  102.         //unregister Observer2 from subject 1
  103.         sub1.unregister(ob2);

  104.         //set new value to subject & only //observer 1 is notified
  105.         sub1.setMyValue(550);
  106.         System.out.println();
  107.         //ob2 can still notice change in //subject 2
  108.         sub2.setMyValue(750);
  109.     }
  110. }
阅读(857) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~