策略设计模式

策略设计模式——我的理解


在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。

例如:关于大闸蟹的做法有很多种,我们以清蒸大闸蟹和红烧大闸蟹两种方法为例

策略设计模式——结构图解


图解

在这里插入图片描述

注意:==策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活==
结构

策略模式的主要角色如下:

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

策略设计模式应用——(“大闸蟹”做菜)


结构
  1. 首先,定义一个大闸蟹加工的抽象策略类(CrabCooking),里面包含了一个做菜的抽象方法 CookingMethod();
  2. 然后,定义清蒸大闸蟹(SteamedCrabs)和红烧大闸蟹(BraisedCrabs)的具体策略类,它们实现了抽象策略类中的抽象方法;
  3. 最后,定义一个厨房(Kitchen)环境类,它具有设置和选择做菜策略的方法。
  4. 客户类(Customer),用于模拟点菜,客户类通过厨房类获取做菜策略。
图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pCuEJVJt-1590668289462)(http://c.biancheng.net/uploads/allimg/181116/3-1Q116103R5638.gif “optional title”)]

源代码
	/**
	 * 抽象策略类:大闸蟹加工类
	 */
	interface CrabCooking{
		// 做菜策略
	    public void CookingMethod();
	}
	/**
	 * 具体策略类:清蒸大闸蟹
	 */
	class SteamedCrabs extends JLabel implements CrabCooking{
		// 实现
		@override
	    public void CookingMethod(){
	    	// 做菜策略,具体实现
	    }
	}

	/**
	 * 具体策略类:红烧大闸蟹
	 */
	class BraisedCrabs extends JLabel implements CrabCooking{
		// 实现
		@override
	    public void CookingMethod(){
			// 做菜策略,具体实现
	    }
	}
	/**
	 * 环境类:厨房
	 */
	class Kitchen{
	    // 抽象策略类的引用
	    private CrabCooking strategy;   
	    // 设置引用
	    public void setStrategy(CrabCooking strategy){
	        this.strategy=strategy;
	    }
	    // 获取引用
	    public CrabCooking getStrategy(){
	        return strategy;
	    }
	    // 选择该策略类对应的做菜的策略
	    public void CookingMethod(){
	        strategy.CookingMethod();      
	    }
	}
// 客户点菜
public class CrabCookingStrategy implements ItemListener{
    private JFrame f;
    private JRadioButton qz,hs;
    private JPanel CenterJP,SouthJP;
    private Kitchen cf;    				//厨房
    private CrabCooking qzx,hsx;    	//大闸蟹加工者   
    public 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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值