博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八月的策略模式
阅读量:6228 次
发布时间:2019-06-21

本文共 2003 字,大约阅读时间需要 6 分钟。

hot3.png

一、前言

某大牛曾经这样描述过设计模式:

设计模式其实就三个准则:一是中意于组合而不是继承 。二是依赖于接口而不是实现。三是高内聚,低耦合。

且不忙讨论这句话是否正确,但从这句话里的口气中我学到一个道理,我其实不应该去畏惧设计模式,以为这是多么难的东西,当以平常心对待设计模式,并将其使用到我们的项目中。

二、原理

1、继承

通过继承来封装一个个拥有共同接口的独立的算法

2、多态机制

通过继承我们定义了多个算法,而通过java的多台机制我们则可以让这些算法之间进行互换。

3、组合

通过组合对策略屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

三、策略模式中的三种角色 

策略模式由三个角色组成:

1) 算法使用环境(Context)角色:它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化

2) 抽象策略(Strategy)角色:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

3) 具体策略(Concrete Strategy)角色:实现了抽象策略角色定义的接口。策略模式各个角色之间关系的类图表示:

四、一些设计原则

1、多用组合,少用继承

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

3、为了交互对象之间的松耦合设计而努力

4、要依赖抽象,不要依赖具体的类

5、最少知识原则:只和你的密友交谈

6、好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你

7、一个类应该只有一个引起变化的原因

五、例子

1、抽象策略角色

package com.fengshu.limanman.dao;public interface IFlyDao {	public void fly();}

2、具体策略角色

package com.fengshu.limanman.dao.impl;import com.fengshu.limanman.dao.IFlyDao;public class CanNotFlyDaoImpl implements IFlyDao {		public void fly() {		System.out.print("sorry i can not fly");	}}

3、又一个具体策略角色

package com.fengshu.limanman.dao.impl;import com.fengshu.limanman.dao.IFlyDao;public class FlyWithWingDaoImpl implements IFlyDao {	@Override	public void fly() {		System.out.println("hello i am flying");			}}

4、上下文角色

package com.fengshu.limanman.model;import com.fengshu.limanman.dao.IFlyDao;public class FlyContext {	private IFlyDao iFlyDao;	public FlyContext(IFlyDao iFlyDao) {		this.iFlyDao = iFlyDao;	}	public void tryFly() {		iFlyDao.fly();	}}

5、测试类

package com.fengshu.limanman.test;import org.junit.Test;import com.fengshu.limanman.dao.impl.CanNotFlyDaoImpl;import com.fengshu.limanman.dao.impl.FlyWithWingDaoImpl;import com.fengshu.limanman.model.FlyContext;public class TestFly {	@Test	public void testTryFly() {		FlyContext flyContext = new FlyContext(new FlyWithWingDaoImpl());		flyContext.tryFly();		FlyContext flyContext2 = new FlyContext(new CanNotFlyDaoImpl());		flyContext2.tryFly();	}}

6、测试结果

hello i am flyingsorry i  can not fly

六、总结

七、后记

希望下次问自己什么事策略模式的时候不要再答不上来,也就是说我不想再写九月的策略模式了。。。。

转载于:https://my.oschina.net/fengshuzi/blog/299124

你可能感兴趣的文章
V8十年故事:从农场诞生的星球最强JS引擎
查看>>
微服务网关Kong 1.0正式发布!提供100+项功能
查看>>
《The Startup Way》作者访谈
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
大规模集群中Docker镜像如何分发管理?试试Uber刚开源的Kraken
查看>>
阿里巴巴陈武:通过亿级用户App的实践验证,锤炼高质量APM体系
查看>>
高效运维最佳实践:如何做好On-call和事故响应?
查看>>
矩阵:如何使用矩阵操作进行 PageRank 计算?
查看>>
C# 8的新提案:new关键字类型推断
查看>>
方面和服务,差别大吗?
查看>>
Rust 和Erlang的对比
查看>>
C# 8中的默认接口方法
查看>>
微信小程序wx:for和wx:for-item的正确用法
查看>>
iOS开源项目周报1222
查看>>
个推开发者服务进阶之路
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
Facebook开源分布式日志存储系统LogDevice
查看>>
JPA 2.2带来一些备受期待的变更
查看>>
Homebrew 1.9发布,将支持Linux与Windows 10
查看>>
Loader 使用文档
查看>>