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