模拟MVC结构使用了观察者模式和动态代理的小小案例

前言:

这个案例是学习设计模式的期末作业,老师很大气的只让我们写一个小案例就行,所以就写了个小小案例,注意:案例是只有逻辑代码,没有具体执行部署。

参考:设计模式(五)观察者模式-CSDN博客 || 动态代理实现动态插入日志-CSDN博客

说明:采用的被观察者(后面称为通知者)命名为Examine类:页面发User数据到controller,controlloer调用service类,在注册函数register类中经过审核后就调用examine的执行函数notify进行通知广播所有被管理的user(也就是观察者)进行状态的更改(user继承的接口有updata这个类来进行state属性的更改)

采用的动态代理进行调用service函数的之前和之后打印一句话(也就是日志),

1controller类:

public class Controller {
    public void logout(User user){
        //实例化代理函数
        UserProxy userProxy = new UserProxy();    
        //根据代理函数产生一个service代理类,这个代理类已经被logger类切入了织点
        UserService userServiceProxy = (UserService) userProxy.getProxy(new UserService());
        //按理来说user1、user2、user3应该是页面传来的,但是案例就自己创建了
        User user1 = new User(1,10010,123);
        User user2 = new User(2,10011,123);
        User user3 = new User(3,10110,123);


        userServiceProxy.logout(user1);
        userServiceProxy.logout(user2);
        userServiceProxy.logout(user3);
    }
}

 2.service类

public interface Service {
    void login(User user);
    void register(User user);
    void logout(User user);
}

public class UserService implements Service{
    public void login(User user){
        if(user == null){
            
        }
        if (user.getState() == 1){
            System.out.println("登录成功");
        }

    }

    public void register(User user){
        ExamineImple examineImple = new ExamineImple();
        /*
        * 判断User是否有效的业务代码.......
        * */
        examineImple.notify(1);
    }

    public  void logout(User user){
        ExamineImple examineImple = new ExamineImple();
        /*
        * 绝定User是否要删除的业务代码.......
        * */
        examineImple.notify(0);
    }
}

3通知者examin


public interface Examine {
    public void attach(Observer observer);
    public void detach(Observer observer);
    public void notify(int notLogout);
}


public class ExamineImple implements Examine {
    //储存待审核的用户
    private List<Observer> logoutUserList = new ArrayList<Observer>();
    @Override
    public void attach(Observer observer) {
        logoutUserList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        logoutUserList.remove(observer);
    }

    @Override
    public void notify(int notLogout) {
        for (Observer observer : logoutUserList){
            observer.update(1);
        }
    }
}

4.代理类


public class UserProxy {
    public static Object getProxy(Object o){
        return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Logger logger =  new Logger();
                        logger.before();
                        Object result = method.invoke(o,args);
                        logger.aftor();
                        return result;
                    }
                }
        );
    }

}

 logger日志类

public class Logger {
    public void before(){
        System.out.println("------调用service------");
    }

    public void aftor(){
        System.out.println("-----调用结束-----");
    }
}

5含有更新函数的实体类

public interface Observer {
    public void update(int notLogout);
}


public class User implements Observer{
    private int id;
    private int name;
    private int pwd;
    //0是注销,1是正常激活状态
    private int state;


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name=" + name +
                ", pwd=" + pwd +
                ", state=" + state +
                '}';
    }

    public User(int id, int name, int pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getName() {
        return name;
    }

    public void setName(int name) {
        this.name = name;
    }

    public int getPwd() {
        return pwd;
    }

    public void setPwd(int pwd) {
        this.pwd = pwd;
    }

    public int getState() {
        return state;
    }

    public User() {
    }

    @Override
    public void update(int notLogout) {
        if (notLogout == 1){
            this.state = 1;
        } else {
            this.state = 0;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个MVC框架与观察者模式案例: 假设我们正在开发一个简单的计算器应用程序。我们可以使用MVC框架来实现该应用程序,其中Model表示计算器的逻辑,View表示计算器的用户界面,Controller表示用户界面和逻辑之间的桥梁。 我们还可以使用观察者模式来实现Model和View之间的通信。当Model中的数据发生更改时,它将通知所有已注册的观察者(即View),以便它们可以更新自己的状态。 以下是一个简单的Python代码示例,演示了如何使用MVC框架和观察者模式来实现计算器应用程序: ```python # Model class Calculator: def __init__(self): self._result = 0 self._observers = [] def add(self, x, y): self._result = x + y self._notify_observers() def subtract(self, x, y): self._result = x - y self._notify_observers() def register_observer(self, observer): self._observers.append(observer) def _notify_observers(self): for observer in self._observers: observer.update(self._result) # View class CalculatorView: def __init__(self, controller): self._controller = controller self._result = 0 def update(self, result): self._result = result self._display_result() def _display_result(self): print("Result: {}".format(self._result)) def run(self): while True: operation = input("Enter operation (+ or -): ") if operation == '+': x = int(input("Enter first number: ")) y = int(input("Enter second number: ")) self._controller.add(x, y) elif operation == '-': x = int(input("Enter first number: ")) y = int(input("Enter second number: ")) self._controller.subtract(x, y) else: print("Invalid operation") # Controller class CalculatorController: def __init__(self): self._model = Calculator() self._view = CalculatorView(self) self._model.register_observer(self._view) def add(self, x, y): self._model.add(x, y) def subtract(self, x, y): self._model.subtract(x, y) def run(self): self._view.run() # Main if __name__ == '__main__': controller = CalculatorController() controller.run() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值