java 设计模式之桥接模式,策略模式

1.引出设计模式

相信大家都玩过王者荣耀这款游戏。我们知道现在大概有九十多个英雄且各自技能及背景故事、台词、被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化等。每一个英雄其实就算是一个策略,实现抽象类‘英雄’,并且每个英雄互不干扰。对于召唤师技能又可以和英雄组合进入游戏里操作使用。那让我们来看看一个匹配模式的简略流程来感受设计模式。

2. 策略模式

2.1 策略模式的定义与特点

策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

策略模式的主要优点如下。
1.多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
2.策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
3.策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
4.策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
5.策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

其主要缺点如下。
1.客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
2.策略模式造成很多的策略类,增加维护难度。

2.2 策略模式的结构与实现

策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性,现在我们来分析其基本结构和实现方法。

1.模式的结构
策略模式的主要角色如下。
1.抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
2.具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
3.环境(Context)类:持有一个策略类的引用,最终给客户端调用。

2.实现
英雄抽象类:

@Data
public abstract class Hero {//英雄名字private String heroName;//英雄描述(台词)private String heroDescription;//英雄普攻public abstract void normalAttack();//英雄被动public abstract void passiveSkill();
}

后裔的实现类:

public class HouYi extends Hero{@Overridepublic void normalAttack() {System.out.println("qiuqiuqiu~");}@Overridepublic void passiveSkill() {System.out.println("箭会增多");}public HouYi() {super.setHeroName("后裔");super.setHeroDescription("觉醒吧,猎杀时刻");}public void  firstSkill(){System.out.println("强化");}public void  secondSkill(){System.out.println("减速");}public void  thirdSkill(){System.out.println("大鸟");}
}

吉吉国王实现类:


public class MonkeyJi extends Hero {@Overridepublic void normalAttack() {System.out.println("pong~pong~");}@Overridepublic void passiveSkill() {System.out.println("先天20%暴击率");}public MonkeyJi() {super.setHeroName("吉吉");super.setHeroDescription("取经之路就在脚下");}public void firstSkill() {System.out.println("护盾");}public void secondSkill() {System.out.println("位移");}public void thirdSkill() {System.out.println("大棒");}
}

目前为止只做了两个英雄,这种设计模式有什么好处呢,好处就是新增英雄很方便,削弱增强很方便,重做也是彼此独立。

3. 桥接模式

3.1 桥接模式的定义与特点

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

通过上面的讲解,我们能很好的感觉到桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。这里将桥接模式的优缺点总结如下。

桥接(Bridge)模式的优点是:
1.抽象与实现分离,扩展能力强
2.符合开闭原则
3.符合合成复用原则
4.其实现细节对客户透明

缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

3.2 桥接模式的结构与实现

可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。

1. 模式的结构
1.桥接(Bridge)模式包含以下主要角色。
2.抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
3.扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
4.实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
5.具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
2. 实现
召唤师技能:

public interface SummonerSkills {public void useTheSkill();
}

闪现的实现类:

public class ShanXian implements SummonerSkills {@Overridepublic void useTheSkill() {System.out.println("位移一段距离");}
}

净化的实现类:

public class JingHua implements SummonerSkills {@Overridepublic void useTheSkill() {System.out.println("解控加免控");}
}

修改英雄抽象类:

import lombok.Data;@Data
public abstract class Hero {//英雄名字private String heroName;//英雄描述(台词)private String heroDescription;//召唤师技能private SummonerSkills summonerSkills;//英雄普攻public abstract void normalAttack();//英雄被动public abstract void passiveSkill();//使用召唤师技能public void useSkill(){this.summonerSkills.useTheSkill();}
}

加入了召唤技能的引用属于组合关系

4.测试

public class Test {public static void main(String[] args) {//选英雄Hero hero =new MonkeyJi();//台词System.out.println("英雄:"+hero.getHeroName()+ "\n台词:"+hero.getHeroDescription());//选择召唤师技能hero.setSummonerSkills(new ShanXian());//开始游戏System.out.println("全军出击!");//使用吉吉二技能MonkeyJi monkeyJi =(MonkeyJi) hero;monkeyJi.secondSkill();//吉吉大招monkeyJi.thirdSkill();//吉吉闪现hero.useSkill();}
}

运行结果:

英雄:吉吉
台词:取经之路就在脚下
全军出击!
位移
大棒
位移一段距离

现在整个桥接,策略模式就结束了。
可能有人会问了,如何设计成通用的测试,就是说模仿前端传值。我只告诉后台我选择了吉吉国王或者铠等英雄,自己去建立对象
我觉得可以通过枚举完成,根据名字创建对象再或者通过代理完成。

java 设计模式之桥接模式,策略模式相关推荐

  1. java设计模式实战-(反射+策略模式)

    学完23种设计模式,相信很多同学都疑问,除了单例模式.工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子. 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景. ...

  2. Java设计模式之3种策略模式实现

    一.什么是策略模式   所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者.比如我们要去某个地方,会根据距离的不同来选择不同的出 ...

  3. Java设计模式(七)策略模式 模板模式

    (十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{public int calculate(Strin ...

  4. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  5. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  6. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  7. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  8. 初探Java设计模式3:行为型模式(策略,观察者等)

    转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 本系列文章将整理到我在Git ...

  9. 【Java设计模式】简单学外观模式——万能遥控器

    目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...

最新文章

  1. 老板:kill -9的原理都不知道就敢到线上执行,明天不用来了
  2. Dao设计模式(Data Access Object)
  3. sqlalchemy1.4风格2.0
  4. mapper中的CDATA标签的用法
  5. 富文本转换字符串 php,php 如何将一个富文本字符串生成word文档?
  6. 学习Spring必学的Java基础知识(2)----动态代理
  7. Android 如何在一个Activity中合理地显示多种类型的checkBox
  8. mysql提高运行效率_提升Mysql执行效率的SQL优化技巧汇总
  9. Word2013无法正常加载mathtype
  10. GoC语言学习(C/C++程序设计语言入门)
  11. 杂志社的电子邮件地址
  12. 相机模型与坐标转换!
  13. oracle otm运输管理系统_OTM服务中国十年-Oracle.PDF
  14. 肠道重要菌属——另枝菌属(Alistipes),调节炎症情绪等的潜力菌
  15. ip ban linux,在Linux中fail2ban:unban ip如何(使用fail2ban-client)
  16. Flutter开发模式之Bloc学习
  17. java 仿照windows的记事本_Java仿Windows记事本源代码分享
  18. Bios工程师手边事—SBIOS添加EC功能
  19. 【海康威视】WPF客户端二次开发:【3】制作WPF/Winform安装包
  20. Lesson 21-22 What’s on your mind now?

热门文章

  1. 连接Oracle时出现ORA-12505错误
  2. 移动端测试-高级手势TouchAction-笔记
  3. 数据安全防脱库解决方案信息泄密根源
  4. 同步亚马逊产品广告(SP)业务数据
  5. 联通老用户转米粉卡 也可以获得6个月小米云服务
  6. lightroom最新版本下载_win10系列之如何最快速从微软官网下载最新版本iso映像
  7. Java实现身份证信息比较大小
  8. pythonsuper多重继承_python多重继承实例 python多重继承下super问题
  9. [益智]:从高楼抛玻璃球,用什么最优策略得到临界层?
  10. Android Dialog 解决输入法挡住输入框的问题