设计模式-策略模式

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.net.URL;

class MovieTicket{
    private double price;
    private Discount discount;

    public void setPrice(double price) {
        this.price = price;
    }

    public void setDiscount(Discount discount) {
        this.discount = discount;
    }
    public double getPrice(){
       return  discount.calculate(this.price);
    }
}
interface Discount{
    public double calculate(double price);
}
class StudentDiscount implements Discount{

    public double calculate(double price) {
        System.out.println("学生票打折");
        return 0.8*price;
    }
}
class VIPDiscount implements Discount{

    public double calculate(double price) {
        System.out.println("VIP打折");
        System.out.println("赠送积分");
        return 0.5*price;
    }
}
class ChildrenDiscount implements Discount{

    public double calculate(double price) {
        System.out.println("儿童票打折");
        return price-10;
    }
}
class XMLUtil{
    public static Object getBean(){
        URL url = StragetyPattern.class.getClassLoader().getResource("config.xml");
        try {
            DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builder=dFactory.newDocumentBuilder();
            Document doc;

            doc=builder.parse(new File(url.toURI()));

            NodeList nl=doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();
            Class c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}
public class StragetyPattern {
    public static void main(String[] args){
        MovieTicket mt=new MovieTicket();
        double originalPrice=60.0;
        double currentPrice;
        mt.setPrice(originalPrice);
        System.out.println("原始价格为:"+originalPrice);
        System.out.println("---------------------------");

        Discount discount=(Discount)XMLUtil.getBean();
        mt.setDiscount(discount);

        currentPrice=mt.getPrice();
        System.out.println("折价后价格为:"+currentPrice);

    }
}

 

<?xml version="1.0" encoding="utf-8" ?>
<config>
    <className>VIPDiscount</className>
</config>

 

写代码时总会出很多的if…else,或者case。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,而策略模式就能较好的解决这个问题,本篇博客就带你详细了解策略模式。

策略模式的定义和使用场景

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。

策略模式的使用场景:

1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

UML类图

这里写图片描述

这个模式涉及到三个角色:

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

 

策略模式用于算法的自由切换和扩展。

1 提供了对开闭原则的支持,不修改原有系统基础上选择增加算法

2 提供了管理相关的算法族的方法。策略类的等级结构定义了一个算法或行为族,恰当使用继承吧公共代码移到抽象策略中,避免重复代码。

3 算法的使用和算法类分开

4 避免多重条件选择

缺点

1 只适用于客户端知道所有的算法和行为的情况

2 产生很多具体策略类

3 无法同时使用同一个策略类,不支持用一个策略完成部分功能后在使用另一个策略类完成生育功能

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面中可以对界面中显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面中查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值