Note

春蚕到死丝方尽,人至期颐亦不休,一息尚存须努力,留作青年为范畴。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

介绍

概念:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

应用场景:用户主动切换执行规则,比如 画图工具,不同的工具执行的事件效果不同. 压缩工具的格式,不同的格式执行不同的压缩算法.

好处:扩展容易,不会破坏原有的结构,遵循开闭原则。

与状态模式的区别:与状态模式的区别在于切换应对策略的主动权在用户,而状态模式的切换是在内部。

 

例子

代码:

 

//工具基类

package note.com.strategy;

/**
 * 工具基类
 * @author lxz
 *
 */
public abstract class ATool {

    public abstract void leftMouseClick();
    
    public abstract void rightMouseClick();
    
    public abstract void leftDoubleMouseClick();
    
}

//具体工具类

package note.com.strategy;

/**
 * 圆形工具
 * @author lxz
 *
 */
public class Circle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个圆");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了圆形的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个圆");
        System.out.println("界面出现了一个圆");
        
    }

}
package note.com.strategy;

/**
 * 油漆桶工具
 * @author lxz
 *
 */
public class PaintKettle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了填充颜色");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了油漆桶的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了填充颜色,颜色更深了");
    }

}
package note.com.strategy;

/**
 * 画笔工具
 * @author lxz
 *
 */
public class Pen extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个点");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了画笔工具的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个点");
        
    }

}
package note.com.strategy;

/**
 * 矩形工具
 * @author lxz
 *
 */
public class Rectangle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个矩形");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了矩形工具的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个矩形");
        System.out.println("界面出现了一个矩形");
    }

}

//画图工具界面类

package note.com.strategy;

/**
 * 管理工具的界面
 * 
 * @author lxz
 *
 */
public class UI {
    private ATool tool = new Pen();// 默认是画笔工具
    public static final int PEN = 1;
    public static final int RECTANGLE = 2;
    public static final int CIRCLE = 3;
    public static final int PAINTKETTLE = 4;
    
    public  UI() {
        System.out.println("画图工具已经启动");
    }
    
    /*
     * 切换工具(状态)
     */
    public void changeTool(int toolNum) {
        switch (toolNum) {
        case PEN:
            tool = new Pen();
            break;
        case RECTANGLE:
            tool = new Rectangle();
            break;
        case CIRCLE:
            tool = new Circle();
            break;
        case PAINTKETTLE:
            tool = new PaintKettle();
            break;
        default:
            tool = new Pen();
            break;
        }
    }
    
    public void leftMouseClick(){
        tool.leftMouseClick();
    }
    
    public void rightMouseClick(){
        tool.rightMouseClick();
    }
    
    public void leftDoubleMouseClick(){
        tool.leftDoubleMouseClick();
    }

}

 

//测试类

package note.com.strategy;

public class ToolTest {
    public static void main(String[] args) {
        System.out.println("启动画图工具......");
        UI ui = new UI();//启动画图工具
        System.out.println("点击画笔工具......");
        ui.changeTool(UI.PEN);//点击画笔工具
        System.out.println("左键点击画板......");
        ui.leftMouseClick();//左键点击画板
        System.out.println("点击圆形工具......");
        ui.changeTool(UI.CIRCLE);//点击圆形工具
        System.out.println("左键双击画板......");
        ui.leftDoubleMouseClick();//左键双击画板
        
    }
}

 

结果:

启动画图工具......
画图工具已经启动
点击画笔工具......
左键点击画板......
界面出现了一个点
点击圆形工具......
左键双击画板......
界面出现了一个圆
界面出现了一个圆

 

根据选择的工具(策略)不同,执行的操作相应也不同,具有一次改变,次次使用的效果.

 

posted on 2016-03-06 10:55  'Note'  阅读(500)  评论(0编辑  收藏  举报