前言废话
干开发也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方法
结束
本人根据网贴 自己实践手打,欢迎指正