我有一个场景,我无法理解使用哪种设计模式
假设有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类相同)
请建议。
问候。
答案 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;
}
?>
希望这是有道理的。但又不确定你为什么要这样做。