Head First设计模式 读书笔记之 策略模式

话说池塘有一群鸭子,其中有各种颜色的,有玩具鸭子,有木头鸭子,有真正的鸭子,鸭子有各种颜色的,红头鸭、绿头鸭等等,有的行为是飞、叫。如果用策略模式如何定义呢?
%e7%ad%96%e7%95%a5%e6%a8%a1%e5%bc%8f

把飞行的行为和呱呱叫的行为分别定义接口,其实就是封装了起来。对于Duck类的子类,可以动态的加载行为类,然后调用相应的方法。不管是加载呱呱叫还是吱吱叫,调用的接口相同,这有点向上转型的意思。

代码:
Duck.java 鸭子的超类

public abstract class Duck {

	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	public Duck() {

	}

	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}

	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}

	public abstract void display();

	public void performFly() {
		flyBehavior.fly();
	}

	public void performQuack() {
		quackBehavior.quack();
	}

	public void swim() {
		System.out.println("All ducks float, even decoys!");
	}
}

MallardDuck.java 野鸭

public class MallardDuck extends Duck {
	
	public MallardDuck() {
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}

	public void display() {
		System.out.println("I'm a real Mallard duck");
	}
}

ModelDuck.java 模型鸭

public class ModelDuck extends Duck {
	public ModelDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}

	public void display() {
		System.out.println("I'm a model duck");
	}
}

FlyBehavior.java 飞行行为类的接口

public interface FlyBehavior {
	public void fly();
}

FlyNoWay.java 飞行接口的实现 不能飞

public class FlyNoWay implements FlyBehavior {
	public void fly() {
		System.out.println("I can't fly");
	}
}

FlyRocketPowered.java 飞行接口的实现 火箭飞行

public class FlyRocketPowered implements FlyBehavior {
	public void fly() {
		System.out.println("I'm flying with a rocket!");
	}
}

FlyWithWings.java 飞行接口的实现 飞行

public class FlyWithWings implements FlyBehavior {
	public void fly() {
		System.out.println("I'm flying!");
	}
}

QuackBehavior.java 呱呱叫行为接口

public interface QuackBehavior {
	public void quack();
}

Quack.java 呱呱叫接口的实现

public class Quack implements QuackBehavior {
	public void quack() {
		System.out.println("Quack");
	}
}

Squeak.java 呱呱叫接口的实现 吱吱叫

public class Squeak implements QuackBehavior {
	public void quack() {
		System.out.println("Squeak");
	}
}

MuteQuack.java 呱呱叫接口的实现 沉默

public class MuteQuack implements QuackBehavior {
	public void quack() {
		System.out.println("<< Silence >>");
	}
}

MiniDuckSimulator.java 入口类

public class MiniDuckSimulator {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.performFly();

		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}
}

输出:
2017-01-14-11-24-44%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

不过多解释了,有时候看代码比看图、看注释还一目了然,正所谓好的代码是自解释的。

关于 targetBzw项目规划

这是一个目标管理的程序,基于 Zend Framework 2,这会是我的第一个 Zend Framework 2项目,这应该是一个小东西,让我熟悉 Zend Framework2。

只是普通的 web,没有api,没有安卓客户端,会有手机版的web。

会有目标和原则两个项目,原则是长期性和持续性的,而目标是阶段性的,是要完成的,而原则没有完成,只有不断的坚持。所以这两项要分开。原则没有完成,延期之类的操作,只要有添加删除基本上就够了。

而目标要分类,短期、长期、终极的目标,能够按照设定的目标期限自动分类,有完成、终止、延期的功能。当然添加、修改、删除的功能是必需的。

能够统计:统计完成率、延期率、提前完成率,能够生成图表,ZF应该有相关的库。

ZF 据说门槛很高,而且我觉得最大的问题是文档少,可能最后要咬牙看英文文档了,我看相关的书籍也都是ZF1版本的。

1.0版本发布

源码: https://coding.net/u/baozhuwanglei/p/blogBzw/git/tree/1.0/
基本具有基本的功能了
几个界面截图:
2017-01-06-17-27-16%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-27-00%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-40%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-27%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-26-07%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-25-20%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

2017-01-06-17-24-58%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be

目前还有没安装功能,想要体验的同学可以手动创建数据库并且导入sql文件,sql文件在 public/static目录下。

接下来的开发计划:
1.*版本:会逐渐修复一些 bug,并且增加一些必要的功能,比如rss。
2.*版本:会进行代码重构,目前的代码混乱,很多地方没有用到 TP的特性。
然后在代码重构的基础上会增加一些功能:

  • 支持插件
  • 后台上传更换模板