关灯
得知互动 门户 互联网+ SEO/SEM 查看内容
0

怎样使用计谋模式优化工程化代码

摘要: 写代码就是建房子一样,好的构造老是可以或许使房子看起来很没。代码也是一样,优雅的构造计划也能让别人看起来也很惬意,纵然代码移交给别人也能少许多坑,作为步伐员你懂的,哈哈。在实际生存中经常碰到实现某种目 ...

写代码就是建房子一样,好的构造老是可以或许使房子看起来很没。代码也是一样,优雅的构造计划也能让别人看起来也很惬意,纵然代码移交给别人也能少许多坑,作为步伐员你懂的,哈哈。


在实际生存中经常碰到实现某种目的存在多种计谋可供选择的环境,比方,出行旅游可以乘坐飞机、乘坐火车、骑自行车或本身开私人车等,超市促销可以釆用打折、送商品、送积分等方法。
在软件开辟中也经常碰到雷同的环境,当实现某一个功能存在多种算法大概计谋,我们可以根据情况大概条件的差别选择差别的算法大概计谋来完成该功能,如数据排序计谋有冒泡排序、选择排序、插入排序、二叉树排序等。
假如利用多重条件转移语句实现(即硬编码),不光使条件语句变得很复杂,而且增添、删除或更换算法要修改原代码,不易维护,违反开闭原则。假如接纳计谋模式就能很好办理该题目。

计谋模式的界说与特点

计谋(Strategy)模式的界说:该模式界说了一系列算法,并将每个算法封装起来,使它们可以相互更换,且算法的变革不会影响利用算法的客户。计谋模式属于对象举动模式,它通过对算法举行封装,把利用算法的责任和算法的实现分割开来,并委派给差别的对象对这些算法举行管理。
计谋模式的首要长处如下。

  1. 多重条件语句不易维护,而利用计谋模式可以制止利用多重条件语句。
  2. 计谋模式提供了一系列的可供重用的算法族,适当利用继续可以把算法族的公共代码转移到父类内里,从而制止重复的代码。
  3. 计谋模式可以提供相偕行为的差别实现,客户可以根据差别时间或空间要求选择差别的。
  4. 计谋模式提供了对开闭原则的完善支持,可以在不修改原代码的环境下,机动增添新算法。
  5. 计谋模式把算法的利用放到情况类中,而算法的实现移到详细计谋类中,实现了二者的别离。


其首要缺点如下。

  1. 客户端必须明白全部计谋算法的区别,以便适时选择适当的算法类。
  2. 计谋模式造成许多的计谋类。

计谋模式的构造与实现

计谋模式是预备一组算法,并将这组算法封装到一系列的计谋类内里,作为一个抽象计谋类的子类。计谋模式的重心不是怎样实现算法,而是怎样构造这些算法,从而让步伐构造更加机动,具有更好的维护性和扩展性,如今我们来分析其根本构造和实现方法。

1. 模式的构造

计谋模式的首要脚色如下。

  1. 抽象计谋(Strategy)类:界说了一个公共接口,各种差别的算法以差别的方式实现这个接口,情况脚色利用这个接口调用差别的算法,一样平常利用接口或抽象类实现。
  2. 详细计谋(Concrete Strategy)类:实现了抽象计谋界说的接口,提供详细的算法实现。
  3. 情况(Context)类:持有一个计谋类的引用,终究给客户端调用。


其构造图如图 1 所示。

怎样使用计谋模式优化工程化代码


图1 计谋模式的构造图

2. 模式的实现

计谋模式的实当代码如下:

package strategy;public class StrategyPattern{ public static void main(String[] args) { Context c=new Context(); Strategy s=new ConcreteStrategyA(); c.setStrategy(s); c.strategyMethod(); System.out.println("-----------------"); s=new ConcreteStrategyB(); c.setStrategy(s); c.strategyMethod(); }}//抽象计谋类interface Strategy{ public void strategyMethod(); //计谋方法}//详细计谋类Aclass ConcreteStrategyA implements Strategy{ public void strategyMethod() { System.out.println("详细计谋A的计谋方法被访问!"); }}//详细计谋类Bclass ConcreteStrategyB implements Strategy{ public void strategyMethod() { System.out.println("详细计谋B的计谋方法被访问!"); }}//情况类class Context{ private Strategy strategy; public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy=strategy; } public void strategyMethod() { strategy.strategyMethod(); }}


步伐运行效果如下:

详细计谋A的计谋方法被访问!
-----------------
详细计谋B的计谋方法被访问!

计谋模式的运用英魂实例

【例1】计谋模式在“大闸蟹”做菜中的运用英魂。
分析:关于大闸蟹的做法有许多种,我们以清蒸大闸蟹和红烧大闸蟹两种方法为例,先容计谋模式的运用英魂。
起首,界说一个大闸蟹加工的抽象计谋类(CrabCooking),内里包罗了一个做菜的抽象方法 CookingMethod();然后,界说清蒸大闸蟹(SteamedCrabs)和红烧大闸蟹(BraisedCrabs)的详细计谋类,它们实现了抽象计谋类中的抽象方法;由于本步伐要表现做好的效果图(点此下载要表现的效果图),以是将详细计谋类界说成 JLabel 的子类;末了,界说一个厨房(Kitchen)情况类,它具有设置和选择做菜计谋的方法;客户类通过厨房类获取做菜计谋,并把做菜效果图在窗体中表现出来,图 2 所示是其构造图。

怎样使用计谋模式优化工程化代码


图2 大闸蟹做菜计谋的构造图


步伐代码如下:

package strategy;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class CrabCookingStrategy implements ItemListener{ private JFrame f; private JRadioButton qz,hs; private JPanel CenterJP,SouthJP; private Kitchen cf; //厨房 private CrabCooking qzx,hsx; //大闸蟹加工者 CrabCookingStrategy() { f=new JFrame("计谋模式在大闸蟹做菜中的运用英魂"); f.setBounds(100,100,500,400); f.setVisible(true); f.setResizable(false); f.setDefaultCloseoperation(JFrame.EXIT_ON_CLOSE); SouthJP=new JPanel(); CenterJP=new JPanel(); f.add("South",SouthJP); f.add("Center",CenterJP); qz=new JRadioButton("清蒸大闸蟹"); hs=new JRadioButton("红烧大闸蟹"); qz.addItemListener(this); hs.addItemListener(this); ButtonGroup group=new ButtonGroup(); group.add(qz); group.add(hs); SouthJP.add(qz); SouthJP.add(hs); //--------------------------------- cf=new Kitchen(); //厨房 qzx=new SteamedCrabs(); //清蒸大闸蟹类 hsx=new BraisedCrabs(); //红烧大闸蟹类 } public void itemStateChanged(ItemEvent e) { JRadioButton jc=(JRadioButton) e.getSource(); if(jc==qz) { cf.setStrategy(qzx); cf.CookingMethod(); //清蒸 } else if(jc==hs) { cf.setStrategy(hsx); cf.CookingMethod(); //红烧 } CenterJP.removeAll(); CenterJP.repaint(); CenterJP.add((Component)cf.getStrategy()); f.setVisible(true); } public static void main(String[] args) { new CrabCookingStrategy(); }}//抽象计谋类:大闸蟹加工类interface CrabCooking{ public void CookingMethod(); //做菜方法}//详细计谋类:清蒸大闸蟹class SteamedCrabs extends JLabel implements CrabCooking{ private static final long serialVersionUID=1L; public void CookingMethod() { this.setIcon(new ImageIcon("src/strategy/SteamedCrabs.jpg")); this.setHorizontalAlignment(CENTER); }}//详细计谋类:红烧大闸蟹class BraisedCrabs extends JLabel implements CrabCooking{ private static final long serialVersionUID=1L; public void CookingMethod() { this.setIcon(new ImageIcon("src/strategy/BraisedCrabs.jpg")); this.setHorizontalAlignment(CENTER); }}//情况类:厨房class Kitchen{ private CrabCooking strategy; //抽象计谋 public void setStrategy(CrabCooking strategy) { this.strategy=strategy; } public CrabCooking getStrategy() { return strategy; } public void CookingMethod() { strategy.CookingMethod(); //做菜 }}


步伐运行效果如图 3 所示。

怎样使用计谋模式优化工程化代码


图3 大闸蟹做菜效果


【例2】用计谋模式实现从韶关去婺源旅游的出行方式。
分析:从韶关去婺源旅游有以下几种出行方式:坐火车、坐汽车和自驾车,以是该实例用计谋模式比力得当,图 4 所示是其构造图。

怎样使用计谋模式优化工程化代码


图4 婺源旅游构造图

计谋模式的运用英魂场景

计谋模式在许多地方用到,如 Java SE 中的容器结构管理就是一个典范的实例,Java SE 中的每个容器都存在多种结构供用户选择。在步伐计划中,通常在以下几种环境中利用计谋模式较多。

  1. 一个体系必要动态地在几种算法当选择一种时,可将每个算法封装到计谋类中。
  2. 一个类界说了多种举动,而且这些举动在这个类的操纵中以多个条件语句的情势出现,可将每个条件分支移入它们各自的计谋类中以取代这些条件语句。
  3. 体系中各算法相互完全独立,且要求对客户隐蔽详细算法的实现细节时。
  4. 体系要求利用算法的客户不应当知道其操纵的数据时,可利用计谋模式来隐蔽与算法相干的数据构造。
  5. 多个类只区别在体现举动差别,可以利用计谋模式,在运行时动态选择详细要履行的举动。

计谋模式的扩展

在一个利用计谋模式的体系中,当存在的计谋许多时,客户端管理全部计谋算法将变得很复杂,假如在情况类中利用计谋工厂模式来管理这些计谋类将大大淘汰客户端的工作复杂度,其构造图如图 5 所示。

怎样使用计谋模式优化工程化代码


图5 计谋工厂模式的构造图


本文泉源:http://c.biancheng.net/view/1378.html


路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有0条评论

最新评论...

本文作者
2020-9-26 03:20
  • 0
    粉丝
  • 9093
    阅读
  • 0
    回复

关注帮客优品

扫描关注,了解最新资讯

联系人:叶先生
Q Q:956130084
EMAIL:956130084@qq.com
地址:中国·武汉
热门评论
排行榜

关注我们:微信订阅号

官方微信

APP下载

全国服务Q Q:

956130084

中国·湖北

Email:956130084@qq.com

Copyright   ©2015-2022  站长技术交流论坛|互联网技术交流平台Powered by©Discuz!技术支持:得知网络  

鄂公网安备 42018502006730号

  ( 鄂ICP备15006301号-5 )