`

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

    博客分类:
  • Java
阅读更多
1.状态(State)模式部分

*设计谜题
---------------------------------------------
状态转换图不变,在售出糖果时,如果剩余糖果数大于1,有10%的几率掉下2个。
---------------------------------------------

Sharpen your pencil
---------------------------------------------
A、B、C、D、E、F
---------------------------------------------

Sharpen your pencil
引用
---------------------------------------------
NoQuarterState:
turnCrank--告诉顾客投入硬币
dispense--什么都不做

HasQuarterState:
insertQuarter--告诉顾客已经有硬币
ejectQuarter--退回硬币,进入NoQuarterState
dispense--掉下1颗糖果,检查剩余糖果数量,大于0,进入NoQuarterState,等于0,进入SoldOutState(更好的方式:转入SoldState处理)

SoldState:
ejectQuarter--告诉顾客正在售出糖果
turnCrank--告诉顾客您没有投入硬币

SoldOutState:
insertQuarter--告诉顾客已售罄
ejectQuarter--告诉顾客您没有投入硬币
dispense--什么都不做

WinnerState:
insertQuarter--告诉顾客正在售出糖果
ejectQuarter--告诉顾客您没有投入硬币
turnCrank--告诉顾客您没有投入硬币
dispense--掉下2颗糖果,检查剩余糖果数量,大于0,进入NoQuarterState,等于0,进入SoldOutState
---------------------------------------------


Brain Power
---------------------------------------------
将调用dispense()方法的代码放到State子类中去实现。
---------------------------------------------

Sharpen your pencil
---------------------------------------------
public class SoldOutState implements State {
  GumballMachine gumballMachine;
  
  public SoldOutState(GumballMachine gumballMachine) {
    this.gumballMachine = gumballMachine;
  }
  
  public void insertQuarter(){
    System.out.println("Sorry,the gumballs are sold out.");
  }
  
  public void ejectQuarter(){
    System.out.println("Sorry,you haven't insert a quarter.");
  }
  
  public void turnCrank(){
    System.out.println("Sorry,you haven't insert a quarter");
  }
  
  public void dispense(){
    //do nothing
  }
}
---------------------------------------------


*运用状态模式给糖果机设计带来的益处是:
让每一个状态“对修改关闭”,让糖果机“对扩展开放”,这样可以方便地加入新的状态类。

状态(State)模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

Sharpen your pencil
---------------------------------------------
public void refill(int count){
  this.count = count;
  if(count>0){
    this.state = noQuarterState;
  }
}
---------------------------------------------


连连看
引用
---------------------------------------------
状态--封装基于状态的行为,并将行为委托到当前状态
策略--将可以互换的行为封装起来,然后使用委托的方法,决定使用哪一个行为
模板方法--由子类决定如何实现算法中的某些步骤
---------------------------------------------


2.状态(State)模式小结

*状态允许一个对象基于内部状态而拥有不同的行为。

*和程序状态机(PSM)不同,状态模式用类代表状态。

*Context会将行为委托给当前状态对象。

*通过把每个状态封装进一个类,我们把以后要做的任何改变局部化了。

*状态(State)模式和策略(Strategy)模式类图相同,但是它们有不同的意图。

*策略(Strategy)模式通常会用行为或算法来配置Context类。

*状态(State)模式允许Context随着状态的改变而改变行为。

*状态转换可以由State类或Context类来控制。

*使用状态模式通常会导致设计中类的数目大量增加。

*状态可以被多个Context实例共享。

3.状态(State)模式实例

/**
 * 钢笔
 * 
 * @author zangweiren
 * 
 */
public class FountainPen implements FountainPenState {
	FountainPenState fullState;
	FountainPenState halfFullState;
	FountainPenState emptyState;

	FountainPenState state;
	int inkLevel = 0;

	public FountainPen() {
		fullState = new FullState(this);
		halfFullState = new HalfFullState(this);
		emptyState = new EmptyState(this);
		state = emptyState;
	}

	@Override
	public void empty() {
		state.empty();
	}

	@Override
	public void fill() {
		state.fill();
	}

	@Override
	public void write() {
		state.write();
	}

	void setState(FountainPenState state) {
		this.state = state;
	}

	FountainPenState getFullState() {
		return fullState;
	}

	FountainPenState getHalfFullState() {
		return halfFullState;
	}

	FountainPenState getEmptyState() {
		return emptyState;
	}

}

/**
 * 钢笔状态接口
 * 
 * @author zangweiren
 * 
 */
public interface FountainPenState {
	void fill();

	void write();

	void empty();
}

/**
 * 满
 * 
 * @author zangweiren
 * 
 */
public class FullState implements FountainPenState {
	FountainPen pen;

	public FullState(FountainPen pen) {
		this.pen = pen;
	}

	@Override
	public void empty() {
		pen.inkLevel = 0;
		pen.setState(pen.getEmptyState());
		System.out.println("The fountain pen is empty now.");
	}

	@Override
	public void fill() {
		System.out.println("Sorry,the fountain pen is already full.");
	}

	@Override
	public void write() {
		pen.inkLevel = pen.inkLevel - 1;
		if (pen.inkLevel == 0) {
			pen.setState(pen.getEmptyState());
			System.out.println("The fountain pen is empty.");
		} else {
			pen.setState(pen.getHalfFullState());
			System.out.println("The fountain pen is half full.");
		}
	}

}

/**
 * 半满
 * 
 * @author zangweiren
 * 
 */
public class HalfFullState implements FountainPenState {
	FountainPen pen;

	public HalfFullState(FountainPen pen) {
		this.pen = pen;
	}

	@Override
	public void empty() {
		pen.inkLevel = 0;
		pen.setState(pen.getEmptyState());
		System.out.println("The fountain pen is empty now.");
	}

	@Override
	public void fill() {
		pen.inkLevel = 100;
		pen.setState(pen.getFullState());
		System.out.println("Congratulations,the fountain pen is full now.");
	}

	@Override
	public void write() {
		pen.inkLevel = pen.inkLevel - 1;
		if (pen.inkLevel == 0) {
			pen.setState(pen.getEmptyState());
			System.out.println("The fountain pen is empty.");
		} else {
			System.out.println("The fountain pen is half full.");
		}
	}

}

/**
 * 空
 * 
 * @author zangweiren
 * 
 */
public class EmptyState implements FountainPenState {
	FountainPen pen;

	public EmptyState(FountainPen pen) {
		this.pen = pen;
	}

	@Override
	public void empty() {
		System.out.println("Sorry,the fountain pen is already empty.");
	}

	@Override
	public void fill() {
		pen.inkLevel = 100;
		pen.setState(pen.getFullState());
		System.out.println("Congratulations,the fountain pen is full now.");
	}

	@Override
	public void write() {
		System.out.println("Sorry,the fountain pen is empty.");
	}

}


测试程序:
---------------------------------------------
public class TestFountainPen {
	public static void main(String[] args) {
		FountainPen pen = new FountainPen();
		pen.fill();
		int count = 5;
		while (count > 0) {
			pen.write();
			count--;
		}
		pen.empty();
		pen.write();
		pen.fill();
		pen.write();
		pen.empty();
	}

}

---------------------------------------------

测试结果:
---------------------------------------------
引用
Congratulations,the fountain pen is full now.
The fountain pen is half full.
The fountain pen is half full.
The fountain pen is half full.
The fountain pen is half full.
The fountain pen is half full.
The fountain pen is empty now.
Sorry,the fountain pen is empty.
Congratulations,the fountain pen is full now.
The fountain pen is half full.
The fountain pen is empty now.

3
0
分享到:
评论

相关推荐

    笔记_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设计模式读书笔记-DesignPatterns.zip

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

    Head First 设计模式 扫描版

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

    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 ...由于书本过长,整理出笔记帮助回想起设计模式。文件是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