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

本章要点:

1.知道OO基础,并不足以让你设计出良好的OO系统。

2.良好的OO设计必须具备可复用、可扩充、可维护三个特性。

3.模式可以让我们建造出具有良好OO设计质量的系统。

4.模式被认为是历经验证的OO设计经验。

5.模式不是代码,而是针对设计问题的通用解决方案。你可把它们应用到特定的应用中。

6.模式不是被发明,而是被发现。

7.大多数的模式和原则,都着眼于软件变化的主题。

8.大多数的模式都允许系统局部改变独立于其他部分。

9.我们常把系统中会变化的部分抽出来封装。

10.模式让开发人员之间有共享的语音,能够最大化沟通的价值


----------------------------------------分割线 ----------------------------------------

下面是实例:

 

解释一下,现在有一个鸭子游戏,每个不同的鸭子都会游泳和呱呱叫,现在想扩展一个飞行方法,但是并不是所有种类的鸭子都会飞行。如果把fly方法取出来,用写成一个Flyable接口,让能飞行的鸭子类去实现这个接口,那么如果子类太多,稍稍需要修改一下飞行的行为,工作量实在是很大。为了更好的实现代码的复用,我们采取以下方法:

定义鸭子超类Duck

public abstract class Duck {
	//为行为接口类型声明引用变量
	FlyBehavior flyBehavior;
	
	public abstract void display();
	//委托给行为类
	public void performFly(){
		flyBehavior.fly();
	}
	
	public void swim(){
		System.out.println("All ducks float, even decoys");
	}
}
定义绿头鸭子类
public class MallardDuck extends Duck {
	//绿头鸭使用Fly类处理飞行,所以当performFly()被调用时,飞的职责被委托给Fly对象。
	public MallardDuck() {
		flyBehavior = new FlyWithWings();
	}
	public void display() {
		System.out.println("I'm a real Mallard duck");
	}
}
编译Fly接口与两个行为实现类

//所有飞行行为类必须实现的接口
public interface FlyBehavior {
	public void fly();
}
----------------------------------------
public class FlyWithWings implements FlyBehavior {
	public void fly() {
		System.out.println("I'm flying!!");
	}
}
----------------------------------------
public class FlyNoWay implements FlyBehavior {
	public void fly() {
		System.out.println("I can't fly");
	}
}
编译测试类

public class App {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		//这会调用MallardDuck继承来的performFly()方法,进而委托给该对象的FlyBehavior对象处理
		mallard.performFly();
	}
}
输出结果: I'm flying!!


动态设定行为:

在Duck类中,加入新方法

public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}
从此以后,我们可以随时调用这个方法改变鸭子的行为。

制造一个新的鸭子类型

public class ModelDuck extends Duck {
	public ModelDuck() {
		//一开始,模型鸭是不会飞的
		flyBehavior = new FlyNoWay();
	}
	public void display() {
		System.out.println("I'm a model duck");
	}
}
改变测试类,加上模型鸭

public class App {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		//这会调用MallardDuck继承来的performFly()方法,进而委托给该对象的FlyBehavior对象处理
		mallard.performFly();
		
		Duck model = new ModelDuck();
		//第一次调用performFly()会被委托给FlyBehavior对象(也就是FlyNoWay实例)
		model.performFly();
		//调用setter方法,把模型鸭装上翅膀
		model.setFlyBehavior(new FlyWithWings());
		//第二次调用飞行方法,如果成功了,就意味着模型鸭可以动态的改变它的飞行行为
		model.performFly();
	}
}


通过以上实例,我们来熟悉一下OO设计的一些原则:

 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

 2.针对接口编程,而不是针对实现编程。

 3.多用组合,少用继承。

这,也就是策略模式(Strategy Pattern)。


策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值