常用设计模式

2017-04-03  本文已影响0人  iEvans

工厂设计模式

package design;
/**
   *静态工厂模式
   */
public class Factory {
/**
   *构造方法私有化
   */
private Factory (){

 }
/**
   * 获取指定类名称的对象
   * @param className    * @param <T>
   * @return T
   */
public static <T> T getInstance(String className){
        T object =null;
        try {
            object = (T) Class.forName(className).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return object;
    }
}

动态代理模式

package design;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
   * 动态代理模式
   */
public class DynamicProxy implements InvocationHandler {
    private Object target;
    /**
     * 代理的目标对象
     * @param target
     * @return
     */
    public Object proxy(Object target){
        this.target=target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    /**
     * 目标方法执行前执行
     * @param object
     */
    public void before(Object object){
        System.out.println("目标方法执行前执行");
    }
    /**
     * 目标方法执行后执行
     * @param object
     */
    public void after(Object object){
        System.out.println("目标方法执行后执行");
    }
    /**
     * Processes a method invocation on a proxy instance and returns
     * the result.  This method will be invoked on an invocation handler
     * when a method is invoked on a proxy instance that it is
     * associated with.
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.before(proxy);
        Object result =method.invoke(proxy,args);
        this.after(result);
        return result;
    }
}

单例模式一

package design;
/**
   * 单例模式一
   */
public class SingletonOne {
    /**
     * 实例化对象唯一
     */
    private static final SingletonOne INSTANCE =new SingletonOne();
    /**
     * 构造方法私有化
     */
    private SingletonOne(){

    }
    /**
     * 获取单例对象
     * @return
     */
    public static SingletonOne getInstance(){
        return INSTANCE;
    }
}

单例模式二

01.png

volatile定义的变量,将直接使用原始数据进行处理,更改后立即生效

package design;
/**
   * 单例模式二
   */
public class SingletonTwo {
    /**
     * 使用volatile关键字修饰单例对象
     * volatile定义的变量,将直接使用原始数据进行处理,更改后立即生效
     */
    public static volatile SingletonTwo instance;
    /**
     * 构造方法私有化
     */
    private SingletonTwo(){

    }
    /**
     * 获取单例对象
     * @return
     */
    public static SingletonTwo getInstance(){
        if(instance ==null){
            //通过同步锁住当前类,来保证线程安全,并提高性能,若直接同步该方法,会大大降低性能
            synchronized (SingletonTwo.class){
                if (instance ==null){
                    instance =new SingletonTwo();
                }
            }
        }
        return instance;
    }
}

中介者模式

(转载自喻红叶《Java与模式-中介者模式》
package design;
/**
 * 同事对象的父类,一般实现成抽象类,用于约束同事对象的类型
 * 同时实现一些功能公共方法,例如持有中介者对象
 */
public abstract class Colleague {
    //所有的同事对象都需要持有中介对象
    private Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public Mediator getMediator() {
        return mediator;
    }
}
package design;
/**
 * 中介者接口
 */
public interface  Mediator {
    /**
     * 同事对象自身状态改变时,通过这个方法通知中介者对象
     * @param obj
     */
    public void changed(Colleague obj);

    /**
     * 中介者对象需要知道所有同事对象
     * @param instance
     */
    public void setCDDriver(CDDriver instance);
    public void setCPU(CPU instance);
    public void setVideoCard(Video instance);
    public void setSoundCard(Sound instance);
}
package design;
/**
 * 光驱类,负责从光盘中读取数据
 */
class CDDriver extends Colleague {
    //从光盘读取的原始数据
    private String originData;

    public CDDriver(Mediator mediator) {
        super(mediator);
    }
    public String getOriginData() {
        return originData;
    }

    /**
     * 读取光盘数据,一旦读取到数据,就要通知中介者对象数据已经准备好了
     */
    public void readCD(String originData) {
        this.originData = originData;
        //通知中介对象,自己的状态发生了改变
        getMediator().changed(this);
    }
}
package design;
/**
 * CPU类,负责将原始数据分离成音频和视频
 */
public class CPU extends Colleague {

    //声音数据
    private String soundData;
    //视频数据
    private String videoData;

    public CPU(Mediator mediator) {
        super(mediator);
    }
    public String getSoundData() {
        return soundData;
    }
    public String getVideoData() {
        return videoData;
    }

    /**
     * 将数据分离,同时通知中介者对象,数据已经分离
     * @param originData
     */
    public void sperateData(String originData) {
        this.soundData = originData.split(",")[1];
        this.videoData = originData.split(",")[0];

        //通知中介对象,自己的状态发生了改变
        getMediator().changed(this);
    }
}
package design;
/**
 * 显卡类,播放视频
 */
public class Video extends Colleague {

    public Video(Mediator mediator) {
        super(mediator);
    }
    public void showVideo(String videoData) {
        System.out.println("正在观看:" + videoData);
    }
}
package design;

/**
 * 声卡类,播放声音
 */
public class Sound extends Colleague {

    public Sound(Mediator mediator) {
        super(mediator);
    }
    public void showSound(String soundData) {
        System.out.println("解说:" + soundData);
    }
}
package design;
/**
 * 主板类,实现中介者
 */
public class MainBoard implements Mediator {
    private CDDriver cd;
    private CPU cpu;
    private Video vc;
    private Sound sc;

    public void setCDDriver(CDDriver instance) {
        this.cd = instance;
    }
    public void setCPU(CPU instance) {
        this.cpu = instance;
    }
    public void setVideoCard(Video instance) {
        this.vc = instance;
    }
    public void setSoundCard(Sound instance) {
        this.sc = instance;
    }

    /**
     * 当同时对象自身状态发生改变时,调用此方法通知中介者对象
     * 中介者对象在进行逻辑控制,与其他同对象交互
     */
    public void changed(Colleague obj) {
        //如果是光驱类,需要通知CPU去分离数据
        if(obj instanceof CDDriver) {
            String originData = ((CDDriver) obj).getOriginData();
            this.cpu.sperateData(originData);
        }else if(obj instanceof CPU){//如果是CPU类,需要通知声卡和显卡去播放
            String videoData = ((CPU) obj).getVideoData();
            String soundData = ((CPU) obj).getSoundData();
            this.vc.showVideo(videoData);
            this.sc.showSound(soundData);
        }
    }
}
package design;
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        Mediator mediator = new MainBoard();
        CDDriver cd = new CDDriver(mediator);
        CPU cpu = new CPU(mediator);
        Video vc = new Video(mediator);
        Sound sc = new Sound(mediator);
        mediator.setCDDriver(cd);
        mediator.setCPU(cpu);
        mediator.setSoundCard(sc);
        mediator.setVideoCard(vc);
        //光驱读数据,通知中介者,中介者通知CPU去分离数据,CPU分离数据完成,通知中介者,中介者通知声卡和显卡播放
        cd.readCD("终结者,终结者音频");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读