策略模式:
一个类的行为或其算法可以在运行时更改。
意图:
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:
一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:
将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
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(jcqz)
{
cf.setStrategy(qzx);
cf.CookingMethod(); //清蒸
}
else if(jchs)
{
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(); //做菜
}
}
————————————————
版权声明:本文为CSDN博主「hear0210」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hear0210/article/details/106084810
策略模式
最新推荐文章于 2024-08-28 11:33:13 发布