JAVA设计模式一策略模式(Strategy Pattern)
什么是设计模式?
就是一些经验。让程序代码更具弹性、好维护、代码复用的经验。而且设计模式都遵从一些OO设计原则。
题外话:以下罗列出常用的OO设计原则:链接
本文章介绍策略模式(Strategy Pattern)。
一、定义:
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
二、用到的设计原则:
1 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
一般情况下,稳定的部分利用继承,变化的部分利用接口。
1 针对接口编程,而不是针对实现编程。
// Animal是一个接口 Dog 类实现了Animal接口
//针对实现编程
Dog d=new Dog();
//针对接口编程
Animal animal=new Dog();
2 多用组合,少用继承。
某一个具体类的行为,不通过继承父类获得,也不通过直接实现接口获得。而是把接口作为变量定义在该具体类中,如果该具体类想要使用这个行为。
在调用这个具体类的时候,set这个接口的具体实现类对象进去,即可获得想要的行为。
三、例子:
题目:公司做了一套模拟鸭子的游戏:呱呱。游戏中会出现各种鸭子,一遍游泳戏水,一边呱呱叫。公司要求,让部分鸭子可以飞翔。鸭子的叫法各不相同,鸭子的飞翔姿势各不相同。试问,如何设计?
public abstract Class Duck{
//组合
FlyBehavior flyBehavior ;
QuackBehavior quackBehavior;
public Duck(){}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior =fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior=qb;
}
public void performFly(){
flyBehavior.fly();
}
public vod perfromQuack(){
quackBehavior.quack();
}
//稳定部分的代码在这里直接实现就好,直接让子类继承,提高代码复用。
//抽象类真的就是生来被用来继承的。为什么变化的部分不在这里写一个抽象方法,
//因为,写接口是为了复用。 } }
public class GreenDuck extends Duck{
public GreenDuck(){}
public void display(){
System.out.println("我是一只绿鸭子!!!");
}
}
public interface FlyBehavior{
public void fly(){};
}
public class Fly1 implements FlyBehavior{
public void fly(){
System.out.println("我正在用第一种方式飞翔!!!");
}
}
public class Fly2 implements FlyBehavior{
public void fly(){
System.out.println("我正在用第二种方式飞翔!!!");
}
}
public interface QuackBehavior{
public void quack(){};
}
public class Quack1 implements QuackBehavior{
public void quack(){
System.out.println("我正在用第一种方式叫!!!");
}
}
public class Quack2 implements QuackBehavior{
public void quack(){
System.out.println("我正在用第二种方式叫!!!");
}
}
public class Test{
public static void main(String[] args){
//接口编程
Duck duck=new GreenDuck();
//组合的调用
duck.setFlyBehavior(new Fly1());
duck.performFly();
}
}
四、个人理解:以上。
JAVA设计模式一策略模式(Strategy Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 设计模式原来如此-策略模式(Strategy Pattern)
策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...
- 【UE4 设计模式】策略模式 Strategy Pattern
概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- 素数定理π(n)~n/lnn弱化版证明
在大半年前写的Miller-Rabin素数测试正确性证明中使用过此结论~当时完全不会证,现在进步了一点点会证弱化版的了Orz 完整版的素数定理: π(n):=|{p|p<=n,p是素数}| li ...
- 重启HA集群NameNode无缘无故挂掉
重启HA集群后,两个NameNode无缘无故挂掉,查看日志时显示错误如下: 原因:journalnode的端口是8485,默认情况下是先NameNode启动后再启动journalnode,如果在Nam ...
- [转]Golang TLS
首先是自签证书: openssl与数字证书的使用 https://blog.csdn.net/yue7603835/article/details/72569012 Golang TLS服务端/客户端 ...
- Python全栈之路----函数----返回值
函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...
- 15.python并发编程(线程--进程--协程)
一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...
- SSL&TLS渗透测试
什么是TLS&SSL? 安全套接字层(SSL)和传输层安全(TLS)加密通过提供通信安全(传输加密)和为应用程序如网络.邮件.即时消息和某些虚拟私有网络(VPN)提供隐私的方式来确保互联网和网 ...
- java程序连接oracle12c报:java.sql.SQLException: ORA-28040: 没有匹配的验证协议。
报错信息: 2017-09-22 15:17:37,204 WARN [org.hibernate.cfg.SettingsFactory] - Could not obtain connection ...
- pam模块初探
- WPF中获取控件默认样式和模板XML
从微软官方找这个东西甚是困难,似乎根本没有提供.网上说因为版本问题,很难找到,但通过代码却可以轻易获得.经测试,生成的样式文件非常完美,完全不用修改即可应用. 代码如下: public static ...
- terraform 配置github module source
terraform 支持多种module 的source 配置 以下是一个简单的使用github source的demo 测试项目 项目结构 ├── init.tpl ├── main.tf 代码 ...