打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《Head First设计模式》阅读笔记.第十二章
1、复合(Complex)模式部分

*模式通常被一起使用,并被组合在同一个设计解决方案中。

*复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。

引用
Brain Power解答:
---------------------------------------------
适配器(Adapter)模式。
---------------------------------------------

呱呱叫解答:
---------------------------------------------
装饰者(Decorator)模式。
---------------------------------------------


Sharpen your pencil解答:
Java代码
  1. ---------------------------------------------   
  2. public abstract class AbstractGooseFactory{   
  3.   public abstract Quackable createGoose();   
  4. }   
  5.   
  6. public class GooseFactory extends AbstractGooseFactory{   
  7.   public Quackable createGoose(){   
  8.     return new GooseAdapter(new Goose());   
  9.   }   
  10. }   
  11. ---------------------------------------------  


Sharpen your pencil解答:
Java代码
  1. ---------------------------------------------   
  2. public class QuackCounter implements Quackable,Observable{   
  3.   Quackable duck;   
  4.   static int numberOfQuacks;   
  5.   Observable observable;   
  6.      
  7.   public QuackCounter(Quackable duck){   
  8.     this.duck=duck;   
  9.     observable=new Observable(this);   
  10.   }   
  11.      
  12.   public void quack(){   
  13.     duck.quack();   
  14.     numberOfQuacks++;   
  15.   }   
  16.      
  17.   public static int getQuacks(){   
  18.     return numberOfQuacks;   
  19.   }   
  20.      
  21.   public void registerObserver(Observer observer){   
  22.     observable.registerObserver(observer);   
  23.   }   
  24.      
  25.   public void notifyObservers(){   
  26.     observable.notifyObservers();   
  27.   }   
  28. }   
  29. ---------------------------------------------  


Sharpen your public解答:
Java代码
  1. ---------------------------------------------   
  2. public class Flock implemtns Quackable,observable{   
  3.   ArrayList quackers=new ArrayList();   
  4.   Observable observable;   
  5.      
  6.   public Flock(){   
  7.     observable=new Observable(this);   
  8.   }   
  9.      
  10.   public void add(Quackable quacker){   
  11.     quackers.add(quacker);   
  12.   }   
  13.      
  14.   public void quack(){   
  15.     Iterator it=quackers.iterator();   
  16.     While(it.hasNext()){   
  17.       Quackable quacker=(Quackable)it.next();   
  18.       quacker.quack();   
  19.     }   
  20.   }   
  21.      
  22.   public void registerObserver(Observer observer){   
  23.     Iterator it=quackers.iterator();   
  24.     While(it.hasNext()){   
  25.       Quackable quacker=(Quackable)it.next();   
  26.       quacker.registerObserver(observer);   
  27.     }   
  28.   }   
  29.      
  30.   public void notifyObservers(){   
  31.   }   
  32. }   
  33. ---------------------------------------------  


*使用组合(Compose)模式时,需要在安全性和透明性之间折中选择。

2、MVC模式部分(模型Model-视图View-控制器Controller)

*视图(View):用来呈现模型。视图通常直接从模型中取得它需要显示的数据和状态。

*控制器(Controller):取得用户的输入并解读其对模型的含义。

*模型(Model):模型持有所有的数据、状态和程序逻辑。模型没有注意到视图和控制器,虽然它提供了操纵和检索状态的接口,并发送状态改变通知给观察者。

*不把控制器的代码(解读视图的输入并操纵模型)放到模型中的原因有两个:
引用
一、会让模型的代码更复杂。模型将具有两个责任,不但要管理用户界面,还要处理如何控制模型的逻辑。
二、会造成模型和视图之间的紧耦合,降低了可复用性。通过模型和视图之间的解耦,使设计更有弹性和容易扩展,能容纳改变。


*MVC和JSP Model 2都属于复合模式。

3、复合(Complex)模式小结

*MVC是复合模式,结合了观察者模式、策略模式和组合模式。

*模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦。

*控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。

*视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。

*这些模式写手合作,把MVC的三层解耦,这样可以保持设计干净又有弹性。

*在MVC模式中,适配器用来将新的模型适配成已有的模型和控制器。

*Model 2是MVC在Web上的应用。

*在Model 2,控制器实现成Servlet,而JSP/HTML实现视图。

4、MVC模式实例

Java代码
  1. /**  
  2.  * 观察目标接口  
  3.  *   
  4.  * @author zangweiren 2010-4-12  
  5.  *   
  6.  */  
  7. public interface Observable {   
  8.     void notifyObservers();   
  9.   
  10.     void registerObserver(Observer observer);   
  11. }   
  12.   
  13. /**  
  14.  * 模型接口  
  15.  *   
  16.  * @author zangweiren 2010-4-12  
  17.  *   
  18.  */  
  19. public interface Ball extends Observable {   
  20.     int getSpeed();   
  21.   
  22.     void move();   
  23.   
  24.     void slowDown();   
  25.   
  26.     void speedUp();   
  27.   
  28.     void stop();   
  29. }   
  30.   
  31. /**  
  32.  * 模型实现类  
  33.  *   
  34.  * @author zangweiren 2010-4-12  
  35.  *   
  36.  */  
  37. public class BallModel implements Ball {   
  38.     private List<Observer> observers = new ArrayList<Observer>();   
  39.     private int speed = 0;   
  40.   
  41.     @Override  
  42.     public int getSpeed() {   
  43.         return speed;   
  44.     }   
  45.   
  46.     @Override  
  47.     public void move() {   
  48.         speed = 10;   
  49.         this.notifyObservers();   
  50.     }   
  51.   
  52.     @Override  
  53.     public void notifyObservers() {   
  54.         Iterator<Observer> it = observers.iterator();   
  55.         while (it.hasNext()) {   
  56.             Observer observer = it.next();   
  57.             observer.speedChanged();   
  58.         }   
  59.     }   
  60.   
  61.     @Override  
  62.     public void registerObserver(Observer observer) {   
  63.         observers.add(observer);   
  64.     }   
  65.   
  66.     @Override  
  67.     public void slowDown() {   
  68.         if (speed > 0) {   
  69.             speed -= 10;   
  70.             this.notifyObservers();   
  71.         }   
  72.     }   
  73.   
  74.     @Override  
  75.     public void speedUp() {   
  76.         speed += 10;   
  77.         this.notifyObservers();   
  78.     }   
  79.   
  80.     @Override  
  81.     public void stop() {   
  82.         speed = 0;   
  83.         this.notifyObservers();   
  84.     }   
  85.   
  86. }   
  87.   
  88. /**  
  89.  * 观察者接口  
  90.  *   
  91.  * @author zangweiren 2010-4-12  
  92.  *   
  93.  */  
  94. public interface Observer {   
  95.     void speedChanged();   
  96. }   
  97.   
  98. /**  
  99.  * 视图  
  100.  *   
  101.  * @author zangweiren 2010-4-12  
  102.  *   
  103.  */  
  104. public class BallView implements Observer {   
  105.     private BallController controller;   
  106.     private Ball ballModel;   
  107.   
  108.     private JButton move;   
  109.     private JButton stop;   
  110.     private JButton speedUp;   
  111.     private JButton slowDown;   
  112.   
  113.     private JFrame main = new JFrame();   
  114.     private JPanel ballPanel;   
  115.     private JButton ball;   
  116.     private JLabel speed;   
  117.   
  118.     private boolean moving = false;   
  119.   
  120.     public BallView(BallController controller, Ball ballModel) {   
  121.         this.controller = controller;   
  122.         this.ballModel = ballModel;   
  123.         this.ballModel.registerObserver(this);   
  124.         initView();   
  125.         showBall();   
  126.     }   
  127.   
  128.     private void drawBall(int x, int y) {   
  129.         ball.setLocation(x, y);   
  130.     }   
  131.   
  132.     private void initView() {   
  133.         main.setTitle("MVC Pattern");   
  134.         main.setSize(300200);   
  135.         main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  136.         main.setResizable(false);   
  137.   
  138.         move = new JButton("Move");   
  139.         stop = new JButton("Stop");   
  140.         speedUp = new JButton(">>");   
  141.         slowDown = new JButton("<<");   
  142.   
  143.         ballPanel = new JPanel();   
  144.         ball = new JButton();   
  145.         ball.setBackground(Color.RED);   
  146.         ball.setEnabled(false);   
  147.         ball.setSize(2020);   
  148.         ball.setLocation(050);   
  149.   
  150.         JPanel p = new JPanel();   
  151.         p.add(move);   
  152.         p.add(slowDown);   
  153.         p.add(speedUp);   
  154.         p.add(stop);   
  155.         stop.setEnabled(false);   
  156.   
  157.         speed = new JLabel("Current speed:" + ballModel.getSpeed());   
  158.         JPanel speedPanel = new JPanel();   
  159.   
  160.         speedPanel.add(speed);   
  161.         main.getContentPane().add(speedPanel, BorderLayout.NORTH);   
  162.         ballPanel.add(ball);   
  163.         main.getContentPane().add(ballPanel);   
  164.         ballPanel.setLayout(null);   
  165.         main.getContentPane().add(p, BorderLayout.SOUTH);   
  166.         main.setVisible(true);   
  167.   
  168.         move.addActionListener(new ActionListener() {   
  169.             public void actionPerformed(ActionEvent e) {   
  170.                 controller.move();   
  171.             }   
  172.         });   
  173.         stop.addActionListener(new ActionListener() {   
  174.             public void actionPerformed(ActionEvent e) {   
  175.                 controller.stop();   
  176.             }   
  177.         });   
  178.         speedUp.addActionListener(new ActionListener() {   
  179.             public void actionPerformed(ActionEvent e) {   
  180.                 controller.speedUp();   
  181.             }   
  182.         });   
  183.         slowDown.addActionListener(new ActionListener() {   
  184.             public void actionPerformed(ActionEvent e) {   
  185.                 controller.slowDown();   
  186.             }   
  187.         });   
  188.     }   
  189.   
  190.     public void setMoveButtonEnable(boolean b) {   
  191.         move.setEnabled(b);   
  192.     }   
  193.   
  194.     public void setMoving(boolean b) {   
  195.         this.moving = b;   
  196.     }   
  197.   
  198.     public void setStopButtonEnable(boolean b) {   
  199.         stop.setEnabled(b);   
  200.     }   
  201.   
  202.     public void showBall() {   
  203.         new Thread() {   
  204.             @Override  
  205.             public void run() {   
  206.                 int x = 0;   
  207.                 int y = 50;   
  208.                 while (true) {   
  209.                     if (!moving) {   
  210.                         continue;   
  211.                     }   
  212.                     drawBall(x, y);   
  213.                     try {   
  214.                         if (ballModel.getSpeed() != 0) {   
  215.                             Thread.sleep(1000 / ballModel.getSpeed());   
  216.                             x++;   
  217.                             if (x > 290) {   
  218.                                 x = 0;   
  219.                             }   
  220.                         } else {   
  221.                             Thread.sleep(1000);   
  222.                         }   
  223.                     } catch (InterruptedException e) {   
  224.                         e.printStackTrace();   
  225.                     }   
  226.                 }   
  227.             }   
  228.         }.start();   
  229.     }   
  230.   
  231.     @Override  
  232.     public void speedChanged() {   
  233.         speed.setText("Current speed:" + ballModel.getSpeed());   
  234.     }   
  235. }   
  236.   
  237. /**  
  238.  * 控制器  
  239.  *   
  240.  * @author zangweiren 2010-4-12  
  241.  *   
  242.  */  
  243. public class BallController {   
  244.     private Ball ballModel;   
  245.     private BallView view;   
  246.   
  247.     public BallController(Ball ballModel) {   
  248.         this.ballModel = ballModel;   
  249.         this.view = new BallView(this, ballModel);   
  250.     }   
  251.   
  252.     public void move() {   
  253.         ballModel.move();   
  254.         view.setMoveButtonEnable(false);   
  255.         view.setStopButtonEnable(true);   
  256.         view.setMoving(true);   
  257.         System.out.println("Ball is moving...");   
  258.     }   
  259.   
  260.     public void slowDown() {   
  261.         ballModel.slowDown();   
  262.         System.out.println("Slow down:" + ballModel.getSpeed());   
  263.     }   
  264.   
  265.     public void speedUp() {   
  266.         ballModel.speedUp();   
  267.         System.out.println("Speed up:" + ballModel.getSpeed());   
  268.     }   
  269.   
  270.     public void stop() {   
  271.         ballModel.stop();   
  272.         view.setMoveButtonEnable(true);   
  273.         view.setStopButtonEnable(false);   
  274.         view.setMoving(false);   
  275.         System.out.println("Ball is stopped.");   
  276.     }   
  277. }   
  278.   
  279. /**  
  280.  * MVC测试类  
  281.  *   
  282.  * @author zangweiren 2010-4-12  
  283.  *   
  284.  */  
  285. public class TestBallView {   
  286.   
  287.     public static void main(String[] args) {   
  288.         Ball ballModel = new BallModel();   
  289.         new BallController(ballModel);   
  290.     }   
  291.   
  292. }  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JAVA设计模式之观察者模式 - Observer
观察者模式
观察者模式-软件设计中的神奇魔法
GoF设计模式之十九 Observer- -
MVC模式简单讲解 - 设计模式 - Java - JavaEye论坛
Android设计模式系列(2)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服