head fiest 设计模式第一章
来源:互联网 发布:青岛中山路美食 知乎 编辑:程序博客网 时间:2024/06/06 02:29
设计准则
面向接口编程而不是实现类
多用组合少用继承
封装将变的分离出来不变的抽出来,很多设计都是有这个演变出来的
第一章讲解的模式是策略模式
作者以设计一个鸭子类的游戏为开端讲解的。Duck类为所有鸭子类的超类,其他类可以继承他
Dack鸭子类里面有多个方法fly behavior eat但是有些鸭子是不会飞的这又如何解决。
其一是将fly方法移植出来,用一个专门的接口进行实现。对应的鸭子类继承Duck类implements接口,
但是假设有一百个不同的fly跟其他不同的行为难道要写一百个吗。
能想到的方法是设计fly,behavior and so on接口,然后设计与鸭子类无关的类,这样我们就可以
进行复用。而设计出来的类与鸭子无关。
具体设计以及代码如下:
行为类
publicinterfaceBehavior
{
publicvoidbehaviorQueck();
}
行为类的实现类
publicclassBehaviorImpleimplementsBehavior
{
@Override
publicvoidbehaviorQueck()
{
System.out.println("吱吱叫");
}
}
飞行接口
publicinterfaceFly
{
publicvoidflyQuck();
}
实现接口的实现类
publicclassFlyImplimplementsFly
{
publicvoidflyQuck()
{
System.out.println("会飞的鸭子");
}
}
and so on的一些类以及实现方法
鸭子类
//有了继承的复用的好处,却没有继承所带来的包袱
publicclassDuck
{
// 引用鸭子
// 利用多态
Behaviorbehavior;
Flyfly;
//鸭子的动作
publicvoidperformQuack()
{
behavior.behaviorQueck();
}
//鸭子飞
publicvoidperformFly()
{
fly.flyQuck();
}
publicvoidswin()
{
System.out.println("鸭子游泳啊啊啊");
}
}
绿头鸭类
//这里初始化的时候做的还不够完善没有弹性不能动态的改变
publicclassMalGreenDuckextendsDuck
{
publicMalGreenDuck()
{
behavior=newBehaviorImple();
fly=newFlyImpl();
}
publicvoiddisplay()
{
System.out.println("这是一个绿头鸭");
}
}
测试类
publicclassTestJava
{
@Test
publicvoidtestDuck()
{
DuckgreenDuck=newMalGreenDuck();
greenDuck.performFly();
greenDuck.performQuack();
}
}
上面我们提到了初始化的时候还不够灵活现在那让我们动态的设定行为
第一在Duck类中添加一个方法
鸭子类
publicclassDuck
{
// 引用鸭子
// 利用多态
//这样的方式利用接口然后就与鸭子类无关,就可以实现复用,只要可以用的鸭子类能利用的类都可以用了。真正实现复用
Behaviorbehavior;
Flyfly;
//添加这样一个方法之后就可以动态的改变鸭子的行为
publicvoidsetFly(FlyImplfly)
{
this.fly=fly;
}
//鸭子的动作
publicvoidperformQuack()
{
behavior.behaviorQueck();
}
//鸭子飞
publicvoidperformFly()
{
fly.flyQuck();
}
publicvoidswin()
{
System.out.println("鸭子游泳啊啊啊");
}
}
制造一个新的鸭子类
publicclassModelDuckextendsDuck
{
publicModelDuck()
{
fly=newFlyImpl();
behavior=newBehaviorImple();
}
publicvoiddisplay()
{
System.out.println("im is a modelDuck");
}
}
动态的改变
@Test
publicvoidmodelDuck()
{
Duckmodel=newModelDuck();
model.performFly();
model.performQuack();
//利用接口动态的改变
model.setFly(newFlySuperImpl());
model.performFly();
}
}
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
阅读全文
0 0
- head fiest 设计模式第一章
- Head Fiest Python读书笔记
- Head First 设计模式第一章 ----策略模式
- Head First设计模式--第一章-策略模式
- 策略模式-《Head Firsh 设计模式》第一章
- [设计模式]head first 设计模式之PHP实现 第一章
- Head First设计模式C++实现--第一章:策略模式
- [设计模式]head first 设计模式之PHP实现 第一章 练习题代码
- 2009-03-14读书记录:《Head First 设计模式》第一章——模式入门
- Head First 设计模式
- Head-first设计模式
- head first 设计模式
- head first 设计模式
- Head First 设计模式
- 《Head First 设计模式》
- Head First设计模式
- Head First《设计模式》
- 《Head First设计模式》
- 浏览器---Chrome前端开发必备插件,如何设置代理,react调试,定死https协议,sublime热更新,浏览器发请求post
- jsp数据交互
- ES5/ES6
- 算法题 100:快速售票系统的座位登记
- POJ 1004 Financial Management
- head fiest 设计模式第一章
- VueJs—常用操作手册
- 动态规划——不同的路径
- 【脚本语言系列】关于Python远程调用,你需要知道的事
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- 替换空格
- 哈夫曼树 (c语言)数据结构
- Valgrind内存泄漏检查及定位利器
- Eclipse搭建HTML5开发环境