Head First 设计模式——策略模式

在这里插入图片描述

前言

最近这两天电脑充电线坏掉了,暂时中断了对HTTP的学习(依赖于电子书),利用少有的空闲时间看了看《汇编语言》与《Head First 设计模式》这两本书,输入了不少,还没产生输出,因此在这里叨叨两句。

《Head First 设计模式》是基于Java的一个讲程序设计经验的书,从开发者的维护、扩展等角度看待代码的设计,更贴近生产的需求。这里着重的不是某种语言能力,而是在设计程序时的设计思想。这也是我第一次接触这方面的知识,带领我从更高的角度看待程序设计。体会到代码的艺术。

非常抱歉的是,拿到这本书已经整整一年了,感谢男神送的礼物哈哈!但始终没有沉下心来认真读一读。非常惭愧。男神大概是我学习计算机的领路人,告诉了我很多知识,也是他的热爱感染了我。Thanks a lot!

策略模式

这本书很方便小白学习的一点是,每个概念都是从实际开发中遇到的问题引入,通过一步步改进让读者领悟到设计模式的魅力。

有一款模拟鸭子的游戏,游戏中会出现各种鸭子,有的鸭子会飞,有的鸭子会叫,在游戏的开发过程中,也需要添加新种类的鸭子。

在代码实现中,所有鸭子(橡皮鸭、绿头鸭)继承自一个Duck类,Duck类中有许多鸭子通用的方法,包括swim等,若想不同的鸭子发出不同的叫声,则最容易想到的方法是

  • 在每一种鸭子类的定义中,重新定义quack()方法。

但是该种方法会使后期的维护成本变高,不但会出现大量重复的代码,对动作修改的成本也会升高。因此继承并不是一个很好的解决方法,这也是在设计中遵守的一个原则

  • 多用组合,少用继承。

另一个需要遵守的设计原则是:

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

把变化的、不稳定的代码抽取出来,不影响其他不变化的部分。在这里也就是将鸭子的行为抽取出来。而如何抽取出来呢?则是需要遵守的第3个原则:

  • 针对接口编程,而不是针对实现编程

将变化的部分抽象为接口,比如QuackBehavior接口,不同的叫声则由行为类实现QuackBehavior接口完成。
这样的话整个代码结构如下所示:

//Duck.java
public abstract class Duck{
	QuackBehavior quackBehavior;
	public Duck{
	}
	public void performQuack(){
		quackBehavior.quack();
	}
}

//QuackBehavior.java
public interface QuackBehavior{
	public void quack();
}

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

//MallardDuck.java
public class MallardDuck extends Duck{
	public MallardDuck(){
		quackBehavior = new Quack();
	}
}

//DuckSimulator.java
public class DuckSimulator{
	public static void main(String[] args){
		Duck Simulator = new MallardDuck();
		Simulator.performQuack();
	}
}

代码的整体思路是通过实现叫这一行为的接口,在鸭子实例化的过程中,采用指定行为类。
这种设计模式就叫做策略模式:

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

Something Else

设计模式就是开发过程中积累下来的设计经验,也是开发者之间的黑话,掌握设计模式,既可以提高设计的实用性,也可以提高开发者之间交流的高效性。

路漫漫其修远,吾将上下而求索。

《Head First 设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值