Пример шаблона стратегии в реальном мире - PullRequest
86 голосов
/ 16 декабря 2008

Я читал о принципале OCP и о том, как использовать шаблон стратегии для достижения этой цели.

Я собирался попытаться объяснить это нескольким людям, но единственный пример, который я могу придумать, - это использовать разные классы проверки, основанные на том, какой статус имеет «заказ».

Я прочитал пару статей в Интернете, но обычно они не описывают реальную причину использования стратегии, например, создание отчетов / счетов / проверки и т. Д. *

Существуют ли примеры из реальной жизни, когда вы считаете, что шаблон стратегии является обычным явлением?

Ответы [ 16 ]

2 голосов
/ 23 января 2009

Вы уверены, что статус "заказа" не является шаблоном состояния? У меня есть догадка, что заказ не будет обрабатываться по-разному в зависимости от его статуса.

Взять, к примеру, метод Корабль на Заказ:

order.Ship();
  • Если способ доставки варьируется в функция его статуса, то вы есть шаблон стратегии.
  • Если однако метод Ship () успешен только когда заказ был оплачен, и заказ еще не отправлен, у вас есть шаблон состояния.

Лучший пример паттерна состояния (и других паттернов), который я нашел, был в удивительной книге «1016 * Head First Design Patterns ». Следующей секундой будет серия блогов Дэвида Кампса .

1 голос
/ 23 мая 2017
public class StrategyDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item item1 = new Item("1234", 10);
        Item item2 = new Item("5678", 40);

        cart.addItem(item1);
        cart.addItem(item2);

        // pay by paypal
        cart.pay(new PaypalStrategy("myemail@example.com", "mypwd"));

        // pay by credit card
        cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
    }
}

interface PaymentStrategy {
    public void pay(int amount);
}

class CreditCardStrategy implements PaymentStrategy {

    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate) {
        this.name = nm;
        this.cardNumber = ccNum;
        this.cvv = cvv;
        this.dateOfExpiry = expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit/debit card");
    }

}

class PaypalStrategy implements PaymentStrategy {

    private String emailId;
    private String password;

    public PaypalStrategy(String email, String pwd) {
        this.emailId = email;
        this.password = pwd;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using Paypal.");
    }

}

class Item {

    private String upcCode;
    private int price;

    public Item(String upc, int cost) {
        this.upcCode = upc;
        this.price = cost;
    }

    public String getUpcCode() {
        return upcCode;
    }

    public int getPrice() {
        return price;
    }

}

class ShoppingCart {

    // List of items
    List<Item> items;

    public ShoppingCart() {
        this.items = new ArrayList<Item>();
    }

    public void addItem(Item item) {
        this.items.add(item);
    }

    public void removeItem(Item item) {
        this.items.remove(item);
    }

    public int calculateTotal() {
        int sum = 0;
        for (Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod) {
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}
1 голос
/ 29 января 2009

Нам пришлось создать сторонний интерфейс обеспечения для корпоративной платформы с очень сложной базой данных. Предоставление данных для предоставления было в виде списка наших типов данных, которые были помещены в приоритетную очередь в нашем приложении, чтобы они могли быть записаны в базу данных в правильном порядке из-за зависимостей.

Процесс записи этих данных был довольно простым, продолжайте выталкивать верхнюю часть очереди с приоритетами, а затем выберите стратегию, основанную на типе извлекаемого объекта.

1 голос
/ 16 декабря 2008

Несколько недель назад я добавил общий интерфейс Java, который был реализован одним из наших доменных объектов. Этот объект домена был загружен из базы данных, и представление базы данных представляло собой звездообразную схему с более чем 10 ветвями. Одним из следствий наличия такого доменного объекта с большим весом является то, что нам пришлось создавать другие доменные объекты, представляющие ту же схему, хотя и менее тяжелые. Поэтому я заставил другие легковесные объекты реализовать тот же интерфейс. Поставь иначе у нас было:

public interface CollectibleElephant { 
    long getId();
    String getName();
    long getTagId();
}

public class Elephant implements CollectibleElephant { ... }
public class BabyElephant implements CollectibleElephant { ... }

Изначально я хотел использовать CollectibleElephant для сортировки Elephant с. Довольно быстро мои товарищи по команде перешли на CollectibleElephant, чтобы выполнить проверки безопасности, отфильтровать их при отправке в графический интерфейс и т. Д.

1 голос
/ 16 декабря 2008

Я использовал стратегический подход в довольно сложном движке в приложении, которое является хорошим примером. По сути, роль движка заключалась в том, чтобы сначала найти список людей, у которых был виджет, а во-вторых, выяснить, какие 10 лучших людей с виджетом основаны на неизвестном количестве параметров (например, на расстоянии от предыдущего бизнеса вместе). , сумма на складе, варианты доставки и т. д. и т. д. ...)

По сути, мы разбили проблему на две стратегии, первой из которых было извлечение данных, так как мы знали, что у нас есть несколько источников наших виджетов, и нам нужно было иметь возможность получать данные и преобразовывать их в общую структуру.

Затем мы также поняли, что у нас было несколько алгоритмов, некоторые из которых основывались на взвешивании параметров, другие были очень странными и приличными, и я не мог отдать им должное, не вытащив изображения и графики, и вы получите картину, у нас было много алгоритмов отбора лучших людей.

Наш сервис был сам по себе тем, что, по сути, определял входы, выходы и делал некоторую нормализацию данных, он также использовал шаблон провайдера для подключения специфических для приложения провайдеров данных и алгоритмических провайдеров, которые использовали стратегию. Это была довольно эффективная система.

У нас были некоторые споры, если мы использовали стратегию или шаблон, который мы никогда не решали.

0 голосов
/ 08 июня 2018

Из википедии

В компьютерном программировании шаблон стратегии (также известный как шаблон политики) является поведенческим шаблоном разработки программного обеспечения, который позволяет выбирать алгоритм во время выполнения. Вместо того, чтобы реализовывать один алгоритм напрямую, код получает инструкции во время выполнения, которые в семействе алгоритмов использовать

В приложении Windows Paint вы можете увидеть шаблон стратегии, в котором вы можете независимо выбирать форму и цвет в разных разделах. Здесь форма и цвет являются алгоритмами, которые могут быть изменены во время выполнения.

Если вы хотите нарисовать кружок красным цветом, вместо предоставления опции «RedCircle», они позволят вам выбрать кружок и цвет по вашему выбору.

Shape redCircle = new RedCircle(); // Without stretegy Pattern
Shaped redCircle = new Shape("red","circle"); // With Strategy pattern

Без паттерна стратегии увеличится количество классов с декартовым произведением формы и цвета. Также интерфейс изменяется для каждой реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...