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): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- RN用蓝牙接入热敏打印机和智能电子秤(转载)
最近要为app用蓝牙接入便携热敏打印机和读蓝牙电子秤.作为一名前端,能涉及到硬件的开发让我觉得兴奋不已,所以我立刻着手开始相应的预研.并把遇到的知识点和问题记录下来. btw,大部分知识点未深入可能有 ...
- jQuery获取元素上一个、下一个、父元素、子元素
jQuery.parent(expr),找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...
- springmvc简单集成shiro
前言: 有天和同事聊天, 谈起权限管理, 他说他有个同事用shiro用的很溜. 正好现在有个管理平台项目, 有权限控制的需求, 因此想借此机会研究一番. 本文主要简单讲解一下对shiro的一些认识, ...
- Kafka 术语
什么是Kafka? Apache Kafka是一个分布式流媒体平台,允许你发布和订阅记录流,允许你以容错方式存储记录流,允许你处理数据流.或是说Kafka是一个分布式.支持分区.多副本的,基于zook ...
- Python全栈之路----进制运算
1.进制拾遗 二进制:01 八进制:01234567 十进制:0123456789 十六进制:0123456789ABCDEF (a是10,b是11,c是12,d是13,e是14,f是15) 2.进 ...
- Python全栈之路---数据类型—字符串
字符串:有序的字符的集合,用于存储和表示基本的文本信息,一对单.双.或三引号中间包含的内容称之为字符串 1.特性:有序,不可变(开辟新地址存储字符串,python解释器会定期清空不用了的已存储的) & ...
- Python全栈之路----函数----嵌套函数
函数内部可以再次定义函数 要执行函数,必须调用 def func1(): print('alex') def func2(): print('eric') func2() #如果没有这一句,不会pri ...
- Reading Level Assessment Using Support Vector Machines and Statistical Language Models-paper
Authors: Sarah E. Schwarm University of Washington, Seattle, WAMari Ostendorf University of Washingt ...
- day04元组
元组 1.元祖书写规范 users=[11,22,33,"老男孩"]#列表(可变) users=(11,22,33,"老纳海")#元祖(不可变) 1.公共方法( ...
- 学习笔记TF017:自然语言处理、RNN、LSTM
自然语言处理 (NLP)问题都是序列化的.前馈神经网络,在单次前馈中对到来数据处理,假定所有输入独立,模式丢失.循环神经网络(recurrent neural network,RNN)对时间显式建模神 ...