使用枚举实现策略模式

Jul*_*lio 1 java design-patterns

我正在尝试创建一个服务来处理不同的付款方式。我想实现策略模式。我想要一个具有不同付款方式的枚举。这是我所拥有的一个例子:

public enum Pay {
    CREDITCARD(1) {
        @Override
        public void pay() {
            System.out.println("Payment functionality");
        }

    },
    OTHERMETHOD(2) {
        @Override
        public void pay() {
            System.out.println("Payment functionality");
        }
    };

    private int id;

    Payment(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public abstract void pay();
}
Run Code Online (Sandbox Code Playgroud)

在客户端的某个地方:

user.setPay(Pay.CREDITCARD);
user.pay();
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是“pay”方法可能有很多逻辑,所以我想把它放在不同的类中。我可以定义一个这样的接口:

public interface Pay {
    void pay();
}

public class CreditCard implements Pay {
    @Override
    public void pay() {
    }
}

public class OtherMethod implements Pay {
    @Override
    public void pay() {
    }
}
Run Code Online (Sandbox Code Playgroud)

在客户端的某个地方:

if (method.equals("creditcard")) {
    user.setPay(new CreditCard());
    user.pay();
}
else {
    user.setPay(new OtherMethod());
    user.pay();
}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢 Enum 的外观以及保持这种方式的原因。谢谢

Dic*_*ici 7

我不建议在枚举中实现逻辑,因为您可能需要调用外部服务来实现支付,因此您希望能够在支付实现中注入这些依赖项。枚举被静态初始化,它们对注入一点也不友好。将一些逻辑放在枚举中是可以的,虽然它们通常应该在很大程度上保持简单的数据,但是这种情况对于在枚举中处理来说似乎太复杂了。您可以使用枚举来决定付款类型,然后根据需要将每个枚举项映射到付款实现的单例,但逻辑应该与枚举分离。