import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;public class Client{                            //环境类public static void main(String[] args) throws InterruptedException {AbstractQQUser target_1=new QQUser("血雨探花");    //QQ好友1号AbstractQQUser target_2=new ConcreteQQUser("西洪市吴彦祖(有钱很闲)");    //2号QQ好友AbstractQQUser yourself=new QQUser("张三花(女)");       //你自己yourself.subscribe(target_1);                           //关注了一号好友yourself.subscribe(target_2);                           //关注了二号好友yourself.setNickName(target_1,"提款机1号");yourself.setNickName(target_2,"这个月的包包");target_1.faDT(new Message("死亡不能让我放弃爱你?",target_1));  //好友1号发帖Thread.sleep(1000);target_2.faDT(new Message("能被人需要是世界上最幸福的事!",target_2));  //好友2号发帖target_1.showQQKJ(yourself);                                      //查看好友1号的qq空间target_2.showQQKJ(yourself);}
}abstract class Subject{                 //抽象目标ArrayList<Observer> observers=new ArrayList<>();public void attach(Observer observer){observers.add(observer);}public void detach(Observer observer){observers.remove(observer);}}interface Observer{                    //抽象观察者void update(Message message,Subject from);void subscribe(Subject target);
}abstract class AbstractQQUser extends Subject implements Observer{         //抽象主题角色String name;                                                  //用户名字ArrayList<AbstractQQUser> friends=new ArrayList<>();          //好友列表ArrayList<Message> messageList=new ArrayList<>();              //刷QQ空间时所要展现的数据ArrayList<Message> myAll=new ArrayList<>();                   //自己发过的所有动态,别人访问你QQ空间时要展现的数据ArrayList<String> guestHistory=new ArrayList<>();   //访客记录public boolean showMyQQKJ(){return false;}public AbstractQQUser(String name) {this.name = name;}public void shuaKJ(){System.out.println("==========================QQ空间动态===========================");for (Message m:messageList) System.out.println(m);System.out.println("=========================================================");}public void faDT(Message message){myAll.add(0,message);for (Observer s:observers)s.update(message,this);}public void setNickName(AbstractQQUser friend,String nicName){ProxyQQUser hasNickNameOne=new ProxyQQUser(friend,nicName);int index=friends.indexOf(friend);friends.remove(index);friends.add(index,hasNickNameOne);}public void showQQKJ(AbstractQQUser who){guestHistory.add(0,who.name+"at:"+new Date());      //添加一条访客记录if (showMyQQKJ()){System.out.println("=========================="+this.name+"的QQ空间动态===========================");for (Message m:myAll) System.out.println(m);System.out.println("=========================================================");}else System.out.println("对方空间不开放");}
}class QQUser extends AbstractQQUser{         //具体观察者,同时也是被观察的具体目标/同时也是代理模式里的真实主题角色public QQUser(String name) {super(name);}@Overridepublic void update(Message message,Subject from) {for (AbstractQQUser user:friends){if (user instanceof ProxyQQUser)if (((ProxyQQUser)user).realSubject==from)message=new Message(message,((ProxyQQUser)user).nickName);}messageList.add(0,message);}@Overridepublic void subscribe(Subject target) {friends.add((AbstractQQUser) target);System.out.println("您以通过了"+((AbstractQQUser)target).name+"的好友申请,可以开始聊天了。");target.attach(this);}}class ProxyQQUser extends AbstractQQUser{AbstractQQUser realSubject;                             //被代理对象String nickName;                                //昵称public ProxyQQUser(AbstractQQUser realSubject, String nickName) {super(realSubject.name);this.realSubject = realSubject;this.nickName = nickName;}@Overridepublic void update(Message message,Subject from) {realSubject.update(message,from);}@Overridepublic void subscribe(Subject target) {realSubject.subscribe(target);}
}class ConcreteQQUser extends AbstractQQUser{        //是模板方法模式里的具体子类(相比较于AbstractQQUser的另一个子类,//改类发布的动态是对其他人可见的public ConcreteQQUser(String name) {super(name);}@Overridepublic boolean showMyQQKJ() {return true;}@Overridepublic void update(Message message, Subject from) {for (AbstractQQUser user:friends){if (user instanceof ProxyQQUser)if (((ProxyQQUser)user).realSubject==from)message=new Message(message,((ProxyQQUser)user).nickName);}messageList.add(0,message);}@Overridepublic void subscribe(Subject target) {friends.add((QQUser)target);System.out.println("您以通过了"+((QQUser)target).name+"的好友申请,可以开始聊天了。");target.attach(this);}
}class Message{Date date;String message;AbstractQQUser author;String nickName;boolean postToFans;public Message(String message, AbstractQQUser author) {this.date = new Date();this.message = message;this.author = author;this.postToFans=true;}public Message(Message message, String nickName) {this.date = message.date;this.message = message.message;this.author = message.author;this.postToFans=true;this.nickName=nickName;}@Overridepublic String toString() {return String.format("%-60s*\n%-60s*\n%-60s*\n",nickName==null?author.name:nickName,format(date),message);}String format(Date date){SimpleDateFormat format=new SimpleDateFormat("yyyy年mm月dd日 mm-ss");return format.format(date);}
}

使用观察者模式、代理模式、模板方法模式模拟QQ发空间,可以给好友设置昵称、给自己的空间设置访问权限相关推荐

  1. 设计模式 — 行为型模式 — 模板方法模式

    目录 文章目录 目录 模板方法模式 应用场景 代码示例 模板方法模式 模板方法模式,定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容: 在模 ...

  2. java设计模式-- 观察者模式 , 外观模式, 模板方法模式

    观察者模式: 观察者模式比较容易理解: 比如天龙八部里面的王语嫣,每次慕容复打架的时候,每当别人将要使出什么绝招时,会提醒慕容复注意提防. 项目中用到的地方就是注册中中心,zookeeper,当Pro ...

  3. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  4. 《设计模式详解》行为型模式 - 模板方法模式

    模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...

  5. 聊聊那些专为算法设计的模式——模板方法模式

    AI越来越火热,人工智能已然成风!而人工智能最重要是各种算法,因此机器学习越来越受到追捧,算法越来越被重视. 作为一个算法的研究者,写出一手高级算法当然是令人兴奋的一件事!但你是否有时会有这种感觉: ...

  6. 行为型模式-模板方法模式

    1.概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关. ...

  7. 李建忠设计模式-组件协作模式-模板方法模式

    目录 1.前言 2.模板方法模式(Template Method) 1.动机 2.例子 3.定义 1.结构图 2.模板方法模式适用情形 3.模式特点 参考 1.前言 现代软件专业分工后的第一个结果是& ...

  8. 设计模式、原则、饿汉式单例模式、抽象工厂、代理模式、观察者模式、模板方法模式使用场景

    设计模式 ​ 对各种面向对象方法的一种总结.前辈们遇到了好多设计问题,然后利用面向对象解决了.然后他们把解决方案汇总起来,形成了20多种设计模式.它可以有效的帮助我们利用面向对象,来提高代码的复用性. ...

  9. 设计模式笔记--模板方法模式

    常用设计模式有23中,分为: 创建型模式(主要用于创建对象) 1.单例模式    2.工厂方法模式    3.抽象工厂模式    4.建造者模式     5.原型模式  行为型模式 (主要用于描述对象 ...

最新文章

  1. 06Chrome调试工具
  2. ECharts开源图表使用方法简单介绍
  3. 虚拟打印机开发日志(一):使用x64 WIN7编译环境编译的完整步骤
  4. Thinking In Java 第四章 控制执行流程
  5. SAP UI5 jQuery.sap.formatMessage
  6. Android 自定义控件之腾讯安全卫士扫描
  7. openwrt 编译时提示缺少libstdc++,libpthread.so.0文件
  8. 我最大的乐趣是不厌其烦地收集人生的各种经历和体验。我喜欢享受人生的各种经历和体验所带给我的难以言表的乐趣...
  9. MFC初探 —— 双击Picture Control具体位置放大图片
  10. Combobox绑定数据源DataSet
  11. Linux下安装Python3.6(可用)
  12. ffmpeg 安装教程
  13. Kaggle首战拿金牌总结!
  14. solaris9 x86安装D-LINK DFE-530TX网卡
  15. 002如何构建hadoop集群环境?
  16. android.view.WindowLeaked报错的解决方案
  17. 【Windows Esp32】基于 libjpeg-9e 编解码库的视频播放器
  18. Ubuntu16.04下安装有道翻译
  19. Java安卓适配全面屏_Android APP全面屏适配技术要点
  20. 冻成鸡爪了,冬天的鱼儿狡猾的干活

热门文章

  1. 打印机的端口重定向的设置
  2. Python先生,你好!(4)——npz、npy文件生成与读取
  3. 使用 C / C++ 产生符合正态分布的随机数
  4. 树莓派3B读取PMW3901光流模块摘要
  5. 大学教授的生活是什么样的呢?
  6. Codeforces Round #719 (Div. 3) A Do Not Be Distracted!
  7. linkerloader
  8. 小米扫地机器人参数以及芯片参数
  9. 何为非侵入式负荷监测-技术路线
  10. 台式计算机的分辨率如何改,电脑分辨率多少合适 调整适合分辨率方法【图文】...