`

《Head First设计模式》阅读笔记.第十二章

    博客分类:
  • Java
阅读更多
1、复合(Complex)模式部分

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

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

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

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


Sharpen your pencil解答:
---------------------------------------------
public abstract class AbstractGooseFactory{
  public abstract Quackable createGoose();
}

public class GooseFactory extends AbstractGooseFactory{
  public Quackable createGoose(){
    return new GooseAdapter(new Goose());
  }
}
---------------------------------------------


Sharpen your pencil解答:
---------------------------------------------
public class QuackCounter implements Quackable,Observable{
  Quackable duck;
  static int numberOfQuacks;
  Observable observable;
  
  public QuackCounter(Quackable duck){
    this.duck=duck;
    observable=new Observable(this);
  }
  
  public void quack(){
    duck.quack();
    numberOfQuacks++;
  }
  
  public static int getQuacks(){
    return numberOfQuacks;
  }
  
  public void registerObserver(Observer observer){
    observable.registerObserver(observer);
  }
  
  public void notifyObservers(){
    observable.notifyObservers();
  }
}
---------------------------------------------


Sharpen your public解答:
---------------------------------------------
public class Flock implemtns Quackable,observable{
  ArrayList quackers=new ArrayList();
  Observable observable;
  
  public Flock(){
    observable=new Observable(this);
  }
  
  public void add(Quackable quacker){
    quackers.add(quacker);
  }
  
  public void quack(){
    Iterator it=quackers.iterator();
    While(it.hasNext()){
      Quackable quacker=(Quackable)it.next();
      quacker.quack();
    }
  }
  
  public void registerObserver(Observer observer){
    Iterator it=quackers.iterator();
    While(it.hasNext()){
      Quackable quacker=(Quackable)it.next();
      quacker.registerObserver(observer);
    }
  }
  
  public void notifyObservers(){
  }
}
---------------------------------------------


*使用组合(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模式实例

/**
 * 观察目标接口
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public interface Observable {
	void notifyObservers();

	void registerObserver(Observer observer);
}

/**
 * 模型接口
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public interface Ball extends Observable {
	int getSpeed();

	void move();

	void slowDown();

	void speedUp();

	void stop();
}

/**
 * 模型实现类
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public class BallModel implements Ball {
	private List<Observer> observers = new ArrayList<Observer>();
	private int speed = 0;

	@Override
	public int getSpeed() {
		return speed;
	}

	@Override
	public void move() {
		speed = 10;
		this.notifyObservers();
	}

	@Override
	public void notifyObservers() {
		Iterator<Observer> it = observers.iterator();
		while (it.hasNext()) {
			Observer observer = it.next();
			observer.speedChanged();
		}
	}

	@Override
	public void registerObserver(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void slowDown() {
		if (speed > 0) {
			speed -= 10;
			this.notifyObservers();
		}
	}

	@Override
	public void speedUp() {
		speed += 10;
		this.notifyObservers();
	}

	@Override
	public void stop() {
		speed = 0;
		this.notifyObservers();
	}

}

/**
 * 观察者接口
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public interface Observer {
	void speedChanged();
}

/**
 * 视图
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public class BallView implements Observer {
	private BallController controller;
	private Ball ballModel;

	private JButton move;
	private JButton stop;
	private JButton speedUp;
	private JButton slowDown;

	private JFrame main = new JFrame();
	private JPanel ballPanel;
	private JButton ball;
	private JLabel speed;

	private boolean moving = false;

	public BallView(BallController controller, Ball ballModel) {
		this.controller = controller;
		this.ballModel = ballModel;
		this.ballModel.registerObserver(this);
		initView();
		showBall();
	}

	private void drawBall(int x, int y) {
		ball.setLocation(x, y);
	}

	private void initView() {
		main.setTitle("MVC Pattern");
		main.setSize(300, 200);
		main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		main.setResizable(false);

		move = new JButton("Move");
		stop = new JButton("Stop");
		speedUp = new JButton(">>");
		slowDown = new JButton("<<");

		ballPanel = new JPanel();
		ball = new JButton();
		ball.setBackground(Color.RED);
		ball.setEnabled(false);
		ball.setSize(20, 20);
		ball.setLocation(0, 50);

		JPanel p = new JPanel();
		p.add(move);
		p.add(slowDown);
		p.add(speedUp);
		p.add(stop);
		stop.setEnabled(false);

		speed = new JLabel("Current speed:" + ballModel.getSpeed());
		JPanel speedPanel = new JPanel();

		speedPanel.add(speed);
		main.getContentPane().add(speedPanel, BorderLayout.NORTH);
		ballPanel.add(ball);
		main.getContentPane().add(ballPanel);
		ballPanel.setLayout(null);
		main.getContentPane().add(p, BorderLayout.SOUTH);
		main.setVisible(true);

		move.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controller.move();
			}
		});
		stop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controller.stop();
			}
		});
		speedUp.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controller.speedUp();
			}
		});
		slowDown.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				controller.slowDown();
			}
		});
	}

	public void setMoveButtonEnable(boolean b) {
		move.setEnabled(b);
	}

	public void setMoving(boolean b) {
		this.moving = b;
	}

	public void setStopButtonEnable(boolean b) {
		stop.setEnabled(b);
	}

	public void showBall() {
		new Thread() {
			@Override
			public void run() {
				int x = 0;
				int y = 50;
				while (true) {
					if (!moving) {
						continue;
					}
					drawBall(x, y);
					try {
						if (ballModel.getSpeed() != 0) {
							Thread.sleep(1000 / ballModel.getSpeed());
							x++;
							if (x > 290) {
								x = 0;
							}
						} else {
							Thread.sleep(1000);
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

	@Override
	public void speedChanged() {
		speed.setText("Current speed:" + ballModel.getSpeed());
	}
}

/**
 * 控制器
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public class BallController {
	private Ball ballModel;
	private BallView view;

	public BallController(Ball ballModel) {
		this.ballModel = ballModel;
		this.view = new BallView(this, ballModel);
	}

	public void move() {
		ballModel.move();
		view.setMoveButtonEnable(false);
		view.setStopButtonEnable(true);
		view.setMoving(true);
		System.out.println("Ball is moving...");
	}

	public void slowDown() {
		ballModel.slowDown();
		System.out.println("Slow down:" + ballModel.getSpeed());
	}

	public void speedUp() {
		ballModel.speedUp();
		System.out.println("Speed up:" + ballModel.getSpeed());
	}

	public void stop() {
		ballModel.stop();
		view.setMoveButtonEnable(true);
		view.setStopButtonEnable(false);
		view.setMoving(false);
		System.out.println("Ball is stopped.");
	}
}

/**
 * MVC测试类
 * 
 * @author zangweiren 2010-4-12
 * 
 */
public class TestBallView {

	public static void main(String[] args) {
		Ball ballModel = new BallModel();
		new BallController(ballModel);
	}

}
2
2
分享到:
评论

相关推荐

    笔记_HeadFirst设计模式.pdf

    笔记_HeadFirst设计模式

    Head.First 设计模式学习笔记.pdf

    ### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    HeadFirst设计模式读书笔记

    HeadFirst设计模式 读书 笔记

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...

    读书笔记:设计模式学习笔记和代码。《图解设计模式》《Head First 设计模式》.zip

    读书笔记:设计模式学习笔记和代码。《图解设计模式》《Head First 设计模式》

    Head First 设计模式 扫描版

    《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...

    Head First设计模式读书笔记-DesignPatterns.zip

    《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...

    HeadFirst设计模式笔记

    《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式这一核心编程概念。设计模式是经过实践验证的解决方案模板,用于解决在软件开发中经常遇到的问题,尤其在面向对象设计中。这篇...

    Head First 设计模式学习笔记(十四)模式的组合使用

    在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...

    《Head First设计模式》读书笔记 -- (第一章)策略模式

    《Head First设计模式》是软件开发领域的一本经典著作,其深入浅出地介绍了23种设计模式。第一章主要讲解的是策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列算法...

    基于Java语言的《Head First 设计模式》学习笔记及实战练习源码

    本项目为《Head First 设计模式》的Java语言学习笔记与实战练习源码集合,包含104个文件,主要包括88个Java源文件、12个Markdown文档、3个XML配置文件及少量其他辅助文件。内容涵盖设计模式的学习笔记以及相应的代码...

    Head First Design Pattern 学习笔记

    著名的《Head First Design Pattern》学习笔记,摘要这本书中的设计思路。由于书本过长,整理出笔记帮助回想起设计模式。文件是docx格式,只能由OFFICE Word 2007之后的版本打开,内附Visio类图文件。本文由个人整理...

    head first 设计模式

    根据提供的信息,“Head First设计模式”是一本广受好评的设计模式书籍。虽然具体的章节内容没有给出,但从描述中得知本书的第22页至39页涵盖了重要的设计模式概念,因此我们将围绕这些页面可能涉及的设计模式进行...

    Head First Servlets & JSP 学习笔记

    以上只是《Head First Servlets & JSP》一书中的部分核心知识点,实际内容还包括过滤器、监听器、MVC设计模式、JSTL等更广泛的主题,旨在帮助读者全面理解和掌握Servlet和JSP技术。通过深入学习,开发者能够构建高效...

    head_first_servlet&jsp学习笔记

    【Servlet&JSP基础知识】 ...以上是`head_first_servlet&jsp`学习笔记的主要知识点,涵盖了Servlet和JSP的基础、Web应用架构、MVC模式、会话管理和JSP编程等多个方面,为深入理解和实践Servlet与JSP开发奠定了基础。

Global site tag (gtag.js) - Google Analytics