使用哪种设计模式在同一类上封装不同的操作

时间:2015-10-21 07:30:20

标签: design-patterns

我有一个场景,我无法理解使用哪种设计模式

假设有A类

enum A {
   A1, A2, A3, OVERALL;

   int value;
   int mod = 0; // represents how many times the value has been modified
    public void changeValue(String newValue) {
           value = newValue;
           mod++;
    }
}

然后我有一些A

的实例
public static void main(String args[]) {
     A obj1 = A.A1;
     A obj2 = A.A2;
     A obj3 = A.A3;
     obj1.changeValue("value1");
     obj2.changeValue("value2");
     obj3.changeValue("value3");
}

现在我想要创建一个对象(比如说" OVERALL"),比如只说一个A的实例,如果A的任何实例改变它的值,那么" OVERALL&# 34;将在A类的任何实例上保留最后更改的值,并且" mod" " OVERALL"的价值每次更改任何A类实例(此处为obj1,obj2,obj3)都会递增。

在上面的代码中,我的" OVERALL"价值是" 3" (因为obj1,obj2,obj3,每个都被修改过一次," OVERALL"对象应该保存的值是obj3的值,因为它最后一次被修改了)

那么哪种设计模式可以用来解决这个设计问题。

我正在尝试重用A类来创建" OVERALL"对象,因为必填字段(即值和mod与A类相同)

请建议。

问候。

1 个答案:

答案 0 :(得分:1)

您需要的是观察者模式。最简单的解决方案是A中的静态变量,用于保存最后一个值和mod值。

package test;


import java.util.Observable;
import java.util.Observer;

public class Test {

public static void main(String[] args) {
    A obj1=new A();
    A obj2=new A();
    A obj3=new A();

    A superSet=new A();

    obj1.addObserver(superSet);
    obj2.addObserver(superSet);
    obj3.addObserver(superSet);


    obj1.changeValue("change1");
    obj2.changeValue("change1");
    obj3.changeValue("change1");

    System.out.println(superSet.mod);
    System.out.println(superSet.value);
    }
}

class A extends Observable implements Observer{

String value;
int mod;

@Override
public void update(Observable o, Object arg) {
    A updatedValue = (A) arg;
    this.value=updatedValue.value;
    mod++;
}

public void changeValue(String newValue) {
    this.value = newValue;
    setChanged();
    notifyObservers(this);
    }
}

因此,如果您更改值或mod,任何A实例的任何时间都会更新,所有实例都会更新。

但是如果你不想使用静态变量,那么你可以使用观察者模式https://dzone.com/articles/observer-pattern-java

所以你要使A成为一个Observable,并使它成为观察者。令人费解的。没有人会理解你为什么要这样做。但是只要处理你的问题所描述的内容,它就会是这样的:

3
change1

打印:

<?php

try{
    $db = new PDO('mysql:host=some.host;dbname=somedb;charset=utf8', 'user', 'pwd');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch(PDOException  $e){
    echo "Error1: ".$e;
}

try{
    $query = $db->query("select * from table_with_json_type");

}catch(PDOException $e){
    echo "Error2: ".$e;
}
?>

希望这是有道理的。但又不确定你为什么要这样做。