Java-可能使用策略设计模式


public class ClassA_V01 {
    private String name;
    private int age;
    // getter and setter
}
public class ClassA_V02 {
    private String name;
    private int age;
    private int gender;
    // getter and setter
}   
public static void main(String[] args) {
    SomeClass classA = new ClassA_V01();
    classA.setName("myName);
    classA.setAge(99);
    performLogic(classA);
    // OR
    SomeClass classA = new ClassA_V02();
    classA.setName("myName);
    classA.setAge(99);
    classA.setAge(1);
    performLogic(classA);
}
public void performLogic(SomeClass classA) {
    // do something
}

为了使策略模式起作用,两个类都必须实现接口中定义的相同方法。但是,如果这些类需要具有不同的字段和方法怎么办?

在我的示例中,clasta_v01和classa_v02是同一类,除了一个具有更多属性的"性别"

如何实现上述内容,以便classa可以等于clasta_v01()或classa_v02?

" ...要使策略模式工作,这两个类都必须实现接口中定义的相同方法。但是,如果这些类需要具有不同的字段和方法,该怎么办?.. "真的这不是策略模式的标准。

策略模式的意图是识别并使算法家族可互换。如果您仔细阅读模式的文档,则只有许多相关类别的行为

才能使用策略。

适当的分解是更好(可扩展)设计的关键。一种典型的(但原始的)解决方案雇员分配,次级tempemp和permanentemp类型将使我们陷入困境,并且不会允许Temp员工在其终身时间内永久性(实际上没有任何意义)术语)。发生这种情况是因为我们错过了一个重要的观点 - 每个员工 applyEness 没有什么不同,他们都是具有不同薪酬策略的员工类型的类型。(可以扩展相同的逻辑以进行休假政策等)

如果所有类型的员工都基于相同组件(同一状态)都有薪水计算,这将变得简单。但是您的问题是,如果tempemployee仅获得基本费用,而永久雇员获得基本款项以及TravelAllowance(tempemp不存在的附加属性)怎么办。这可以通过简单继承层次结构的组合以及计算算法的策略来建立模型

public class Employee {
    //name and id
    private PayPackage payPackage;
    private int age;
    PayPackage strategy;
    public double computeSalary() {
        return payPackage.computePay(age);
    }
    //get/setPayPackage(...)
}
public abstract class PayPackage {
    private double basicPay;
    abstract public double computePay(int age);
    protected double getBasicPay(){
        return basicPay;
    }
}
public class TempPayPackage extends PayPackage{
    @Override
    public double computePay(int age) {
        double veteranAllowance = 0;
        if (age > 40) {
            veteranAllowance = 2000.00;
        }
        return getBasicPay() + veteranAllowance;
    }
}
public class PermanentPayPackage extends PayPackage{
    private double travelAllowance;
    @Override
    public double computePay(int age) {
        double veteranAllowance = 0;
        if (age > 40) {
            veteranAllowance = 5000.00;
        }
        return getBasicPay() + travelAllowance + veteranAllowance;
    }
}

要记住的重要事项是设计模式永远不会单独工作或作为替代方案,它们与面向对象的代码和其他模式并驾齐驱。

最新更新