Blog icon indicating copy to clipboard operation
Blog copied to clipboard

设计模式

Open RWebRTC opened this issue 7 years ago • 0 comments

创建型模式

简单工厂模式

客户端不关心对象创建,传入有限参数就可以创建某些对象,在不更新客户端代码情况下调整对象的创建策略。但是如果工厂出错,所有客户端都受影响。

public abstract class Child {

    abstract void say();

}

public class Child1 extends Child {

    private final String name;

    Child1(String name) {
        this.name = name;
    }

    @Override
    void say() {
        System.out.println("Child1: name is " + name);
    }
}

public class Child2 extends Child {

    private final int age;

    Child2(int age) {
        this.age = age;
    }

    @Override
    void say() {
        System.out.println("Child2: age is " + age);
    }
}

public class Factory {

    public static Child getChild(@NotNull String type) {
        switch (type) {
            case "child1": {
                return new Child1("child1");
            }
            case "child2": {
                return new Child2(18);
            }
        }
        return null;
    }

}

public class ClassMain {

    public static void main(String[] args) {
        Child child1 = Factory.getChild("child1");
        Child child2 = Factory.getChild("child2");

        child1.say();
        child2.say();
    }

}

单例模式

单例模式提供唯一对象访问,但是没有抽象层,职责过重,单一对象被销毁后,状态丢失。

public class SingleClass {

    private static SingleClass single;

    private SingleClass() {
    }

    public static SingleClass getInstance() {
        if (single == null) {
            synchronized (SingleClass.class) {
                if (single == null) {
                    single = new SingleClass();
                }
                return single;
            }
        }
        return single;
    }

}

行为型模式

策略模式

管理算法族,替换继承,但是客户端需要清楚的了解其内部实现原理。

public abstract class BaseClass {
    abstract void sayILoveYou();
}

public class ChildClassA extends BaseClass {
    @Override
    void sayILoveYou() {
        System.out.println("I love you, Java!");
    }
}

public class ChildClassB extends BaseClass {
    @Override
    void sayILoveYou() {
        System.out.println("I love you, YY!");
    }
}

public class ClassMain {

    private BaseClass baseClass;

    private void setBaseClass(BaseClass baseClass) {
        this.baseClass = baseClass;
    }

    public static void main(String[] args) {
        ClassMain classMain = new ClassMain();

        classMain.setBaseClass(new ChildClassA());
        classMain.baseClass.sayILoveYou();

        classMain.setBaseClass(new ChildClassB());
        classMain.baseClass.sayILoveYou();
    }

}

观察者模式

表示层和数据层之间进行了分离,可以使用广播进行通信,在对象和观察者之间建立一定抽象耦合关系。但是许多观察者观察一个对象,对象变化时,通知所有观察者需要一定时间,观察者也只是知道对象变化了,不一定知道对象如何变化,如果对象和观察者之间循环引用,会引起 Crash。

public abstract class Subject {

    protected String state;

    public String getState(){
        return state;
    }

    private ArrayList<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        if (observers.contains(observer)) {
            observers.remove(observer);
        }
    }

    public void notifyObserver() {
        for (Observer o : observers) {
            o.update(this);
        }
    }

}

public abstract class Observer {

    public abstract void update(Subject subject);

}

public class ConcreteSubject extends Subject {

    public void change(String state){
        this.state = state;
        notifyObserver();
    }

}

public class ConcreteObserver extends Observer {

    private final String myName;

    ConcreteObserver(String myName) {
        this.myName = myName;
    }

    @Override
    public void update(Subject subject) {
        System.out.println(myName + ": " + subject.getState());
    }
}

public class Main {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer1 = new ConcreteObserver("observer1");
        ConcreteObserver observer2 = new ConcreteObserver("observer2");
        subject.attach(observer1);
        subject.attach(observer2);
        subject.change("change in main");
    }
}

RWebRTC avatar Feb 27 '17 14:02 RWebRTC