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

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

  hot3.png

前言废话

干开发也6年多了 水平只能说是工作环境中周围的人中 还算能干 (能干不是说技术好)

去年的时候已经感觉到了技术瓶颈(工作都是框架模式,没有人带,技术只能说是够企业开发用)

却因为忙碌的工作一直放下整块的时间去学习 零散的时间用来解决bug 或者看写blog  自己很少写

现在开始写blog的目的也是想塑造一下自己,重新回归小白的日子,blog 也是我诉苦的一个地方,80后到处漂,然后在一个城市发展 举目四望 确没有什么朋友 没有自己的圈子,活着也挺可悲的,在忙碌的工作中的感触就是不期待,没有期待,今天和明天没有什么不一样的.渣渣话说了 也说点正能量和的,  我会坚持健身  朋友送的瑜伽垫 我用了一年 也坚持了一年的健身, 当然也会因为懒 锻炼3355的, 但是真的听上瘾的 ,我不能 要求别人多美,但是我可以要求自己更好一点,不希望自己是一个手无握鸡之力的人,  麒麟臂已装备,公狗腰已成 可敢一战?

 

 

正文

以前面试的时候被问过一个interface 和abstract 的区别

当时定义和规范什么的能答出来  但是设计到思想上我就完全懵逼了,现在有零散的时间回来再学习一下设计模式

策略模式:

需求:

1.设计几只鸭子能说话,有不同的颜色

因为开始的需求都是共同的,所以设计成一个共同的父类,继承完事

2.需求变更---->>要加上一个会飞的能力(这个必须的有啊,无论是企业的业务拓展还是游戏的某项功能都要有这些的)

这个时候会有考虑加进父类里面,注意这里如果加进去会有的问题:  耦合度太高-->>不是那个鸭子都有飞的能力,如果不会飞 还需要在子累里面重写父类飞的方法

如果用接口的形式可以实现松耦合,把需要会飞的类加上继承这个飞的接口,代码如下:

 

public interface Fly {		public void fly();}public class DuckAbstract {	public void display(){			}		public void say(){		System.out.println("呱呱叫");	}	public void swim(){		System.out.println("游泳");	}}public class DuckA extends DuckAbstract implements Fly {	@Override	public void display(){		System.out.println("丑小鸭");	}	@Override	public void fly() {		System.out.println("我会飞");	}}public class DuckB extends DuckAbstract implements Fly{	@Override	public void display() {		System.out.println("小白鸭");	}		@Override	public void fly() {		System.out.println("我还不会飞");	}}

 

如上所述,但是问题又来了

实现了接口解决了搜耦合,但是说好的代码复用呢?

------------------------- strategy(策略模式) -------------------------

public interface Fly {		public void fly();}//天鹅public class Swan implements Fly {	@Override	public void fly() {		System.out.println("天鹅会飞");	}}//旱鸭public class DryDuck implements Fly {	@Override	public void fly() {		System.out.println("旱鸭不会飞");	}}public abstract class Duck {    // 看到这里我怎么感觉都很眼熟?是不是在ctronler里面常见的service?,    //这里的fly有不同的实现类: 实现了不同的行为,而ctronler里面的service 是注入进来的	Fly fly;	public abstract void display();	public void say() {		System.out.println("呱呱叫");	}	public void fly() {		fly.fly();	}}// 测试 策略模式public class TestStrategy {	public static void main(String[] args) {		DuckDry a = new DuckDry();		DuckSwan b = new DuckSwan();		a.say();		a.fly();		b.say();		b.fly();	}}// 输出结果呱呱叫旱鸭不会飞呱呱叫天鹅会飞

 

这里的旱鸭和天鹅我理解为:行为抽象的具体实现

抽象的是鸭子

抽象的内容是:鸭子会飞的行为

具体实现的是能飞不能飞

________________________________

总结

这里解决了第一段代码的松耦合,又解决实现代码中的代码复用问题

问题:

如果再来一组新的行为怎么办?

比如: 新加一组跳舞的动作:有会爵士的,有会拉丁,有会交际的

解决:

新来一个借口 写dance()方法  然后 实现这个方法?

学完策略模式之后你再这样想 就白学了

道理是一样的  写多个对应的dance实现类  实现 dance 接口

在实体类里面定义这个实现类的子类的类型(对应的功能,比如是拉丁舞)

 

这样在调用该类的dance方法时 自然会调用对应的dance方法

结束

 

本人根据网贴 自己实践手打,欢迎指正

转载于:https://my.oschina.net/osmoon/blog/917999

你可能感兴趣的文章
kvm命令学习记录
查看>>
小菜鸡进阶之路-First week
查看>>
ORACLE 10g SYSAUX表空间快速增长之WRH$_ACTIVE_SESSION_HISTORY篇
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
自适应布局
查看>>
子数组的和的最大值(包括升级版的首尾相连数组)
查看>>
LeetCode - Nth Highest Salary
查看>>
9.ORM数据访问
查看>>
(转)Redis
查看>>
WIN10常用快捷键
查看>>
href=“javascript:”vs href=“javascript:void(0)”
查看>>
win10文件夹无法打开,双击闪屏
查看>>
【学习笔记14】全局类型转换器
查看>>
Spring Boot学习记录手册<1>
查看>>
在Word2007和Word2010中插入视频文件,并自动在word中播放
查看>>
javascript设置http请求的头信息
查看>>
C++调用java开启远程调试
查看>>
struts2与ajax交互
查看>>
Linux Shell脚本中点号和source命令
查看>>