设计模式

工厂模式和策略模式

public class TestDemo {
    //策略模式实现
    public static void testDemo(){
//        CatchSuper catchSuper = CatchFactory.createCatchAccept(CatchPlicy.CatchRebat);
//        double accptMoney = catchSuper.acceptCatch(1000);
       double accptMoney =  new CatchContext(CatchPlicy.CatchRebat).GetResult(1000);
        System.out.print(accptMoney);

    }
}
abstract class CatchSuper {
    public abstract double acceptCatch(double money);
}
//不打折
class NormarCatc extends CatchSuper {

    @Override
    public double acceptCatch(double money) {
        return money;
    }
}

//打折
class CatchRebat extends CatchSuper{
    private double rebat = 1d;
    public CatchRebat(double rebat){
        this.rebat = rebat;
    }
    @Override
    public double acceptCatch(double money) {
        return money*this.rebat;
    }
}

//满减
class CatchReturn extends CatchSuper{
    private double moneyCondition = 0.0d;
    private double moneyReturn = 0.0d;
    public CatchReturn(double moneyCo,double moneyre){
        this.moneyCondition = moneyCo;
        this.moneyReturn = moneyre;
    }
    @Override
    public double acceptCatch(double money) {
        double result = money;
        if (money >= this.moneyCondition){
            result = money - Math.floor(money/moneyCondition)*moneyReturn;
        }
        return result;
    }
}
//活动策略
enum CatchPlicy{
    NormarCatc,CatchRebat,CatchReturn

}
// 工厂实现
//class CatchFactory{
//    public static CatchSuper createCatchAccept(CatchPlicy policy){
//        CatchSuper cs = null;
//        switch (policy){
//            case NormarCatc:
//                cs = new NormarCatc();
//                break;
//            case CatchReturn:
//                cs = new CatchReturn(300,100);
//                break;
//            case CatchRebat:
//                cs = new CatchRebat(0.85);
//                break;
//        }
//        return cs;
//    }
//
//}

//策略管理类实现
class CatchContext{
    CatchSuper cs = null;
    public CatchContext(CatchPlicy policy){
        switch (policy){
            case NormarCatc:
                cs = new NormarCatc();
                break;
            case CatchReturn:
                cs = new CatchReturn(300,100);
                break;
            case CatchRebat:
                cs = new CatchRebat(0.85);
                break;
        }
    }
    public double GetResult(double money){
        return cs.acceptCatch(money);
    }
}

代理模式


/*
* 实现通过代理实现送礼物给校花,本人不用直接出面
* */
public class TestDelegateMode {
    public static void testDelegate(){
        BeautyGirl girl = new BeautyGirl("校花");
        Proxy proxy = new Proxy(girl);
        proxy.GiveDolls();
        proxy.GiveFlowers();

    }
}
//接口
interface IGiveGift {
    void GiveDolls();
    void GiveFlowers();
}
//被代理方
class BeautyGirl{
    public String name;
    public BeautyGirl(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }


}
//代理方
class Pursuit implements IGiveGift {
    String name;
    BeautyGirl beauty;
    public Pursuit(BeautyGirl beauty){
        this.beauty = beauty;
        this.name = "john";
    }
    @Override
    public void GiveDolls() {
        System.out.print(this.name+" GiveDolls to "+beauty.name);
    }

    @Override
    public void GiveFlowers() {
        System.out.print(this.name+" GiveFlowers to "+beauty.name);
    }
}

//代理
class Proxy implements IGiveGift{
    Pursuit pursuit;
    public Proxy(BeautyGirl beautyGirl){
        this.pursuit = new Pursuit(beautyGirl);
    }
    @Override
    public void GiveDolls() {
        pursuit.GiveDolls();
    }

    @Override
    public void GiveFlowers() {
        pursuit.GiveFlowers();
    }
}

观察者模式也叫发布订阅模式
第一次画uml图,mac使用umlStar umlstar使用

在这里插入图片描述

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;

public class ObserModeDemo {
    public static void testObserverDemo(){
        Boss boss = new Boss();
        StockObserver worker1 = new StockObserver("bob",boss);
        StockObserver worker2 = new StockObserver("john",boss);
        StockObserver worker3 = new StockObserver("tom",boss);
        StockObserver worker4 = new StockObserver("lili",boss);
        boss.Attach(worker1);
        boss.Attach(worker2);
        boss.Attach(worker3);
        boss.Attach(worker4);
        boss.setSubjectState("老板回来了,注意点");
        boss.Notify();
    }
}
//被观察者要继承的抽象类
abstract class Observer{
    String name;
    Subject subject;
    public Observer(String name,Subject sub){
        this.name = name;
        this.subject = sub;
    }
    public abstract void Update();
}
//接口
interface Subject{
    void Attach(Observer observer);
    void Detech(Observer observer);
    void Notify();
    String getSubjectState();
    void setSubjectState(String state);
}
//观察者
class Boss implements Subject{
    private String state;
    private ArrayList<Observer> observers  =  new ArrayList<Observer>();
    @Override
    public void Attach(Observer observer) {
        Iterator it = observers.iterator();
        while (it.hasNext()){
            Observer ob = (Observer) it.next();
            if (observer.equals(ob) ){
                //判断之前是否已经添加过
                return;
            }
        }
        observers.add(observer);
    }

    @Override
    public void Detech(Observer observer) {
        Boolean isContain  = false;
        Iterator it = observers.iterator();
        while (it.hasNext()){
            Observer ob = (Observer) it.next();
            if (observer.equals(ob) ){
                isContain = true;
            }
        }
        //判断是否存在
        if (isContain==true){
            observers.remove(observer);
        }
    }

    @Override
    public void Notify() {
        Iterator it = observers.iterator();
        while (it.hasNext()){
            //消息分发,当然也可以用链表,让观察者可以截断后续的接收者,类似广播
            //这里可以进行消息分发顺序处理
            Observer ob = (Observer) it.next();
            ob.Update();
        }
    }

    @Override
    public String getSubjectState() {
        return this.state;
    }

    @Override
    public void setSubjectState(String state) {
        this.state = state;
        //当然也可以设置一旦state状态发生改变就分发
//        this.Notify();
    }


}
//被观察者
class StockObserver extends Observer{
    public StockObserver(String name,Subject sub) {
        super(name,sub);
    }
    @Override
    public void Update() {
        System.out.print(subject.getSubjectState()+"通知"+name+"注意 \n");
    }
}

观察者代理模式使用多代理回调实现

import java.util.HashMap;

public class TestDelegateForNew {
    public static void testDelegateNew(){
        Work1 work1 =  new Work1();
        Work2 work2 = new Work2();
        callbackUtils.addCallback("work1",work1);
        callbackUtils.addCallback("work2",work2);
        callbackUtils.delegateCallback("work1");
        callbackUtils.publish();
    }
}
//多代理回调
interface CallBack{
    public void dowork();
}

//回调管理类
class callbackUtils{
    private static HashMap<String,CallBack> callbacks= new HashMap<>();
    public static void addCallback(String s,CallBack bac){
        callbacks.put(s,bac);
    }
    public static void delegateCallback(String s){
        callbacks.remove(s);

    }
    public static   void publish(){
        if (callbacks.size()==0){
            return;
        }
        for (CallBack callback:callbacks.values()){
            callback.dowork();
        }
    }

}

class Work1 extends Object implements CallBack{

    @Override
    public void dowork() {
        System.out.print("设计程序 \n");
    }
}
class Work2 extends Object implements CallBack{

    @Override
    public void dowork() {
        System.out.print("敲代码 \n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值