手机最开始用于通话,后来增加了短信功能,初步满足了人与人之间的沟通需求。然而短信只能发文字,于是出现了能够发图片的彩信,但不管短信还是彩信,资费都太贵了,令人惜墨如金。 后来移动公司推出飞信,它支持从电脑向手机免费发短信,因而风靡一时。 到了智能机时代,更懂用户的微信异军突起,只需耗费少数流量即可发送丰富的图文消息,由此打败了短信、彩信、飞信,成为人们最常用的社交App。

文件:url80.ctfile.com/f/25127180-741946922-95930b?p=551685 (访问密码: 551685)

一、需求描述

聊天属于微信的基础功能,包括单人聊天和多人聊天:

(1)单人聊天简称私聊,用于一对一的聊天,聊天消息只发给对方;

(2)多人聊天简称群聊,用于多对多的聊天,该群的所有成员都会收到群消息。 聊天界面既能发送文本消息,也能发送图片消息,且对方消息靠左对齐,我方消息靠右对齐。

二、功能分析

即时通信有两个意思:

(1)第一个是通信,也就是传输消息,至少支持包含文字与图片在内的图文消息;

(2)第二个是即时,也叫实时,发出来的消息要马上送到对方那里; 即时通信的特性决定了它没法采用基于短连接的HTTP协议,而必须采用基于长连接的网络协议,比如Socket、MQTT、IMPP、XMPP等等。

即时通信工具用到的技术

1)底部标签栏:用于控制切换到哪个页面。

(2)列表控件:用于展示好友列表和群聊列表。

(3)输入对话框:用于个人信息页面修改用户昵称。

(4)圆角矩形图形:用户头像采用了圆角矩形裁剪。

(5)Socket通信:聊天消息实时传给对方,需要采取Socket通信与后端服务器交互。

(6)移动数据格式JSON:聊天的图文消息要封装为JSON格式。


在日常生活中,你在购买时,可能还会加一些小料(凑单满减),例如燕奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha)等,在付款时,电脑的订单系统会根据你点的饮料和加的小料计算出总的价钱。

我们现在就是要设计一个能自动计算价格的订单系统。

最简单的方法,就是所有的饮料包括小料都写一个实现类,但是这样在后期就是一个维护噩梦。不说可能有几百种饮料几百种实现方式,如果后期稍微改动其中一款小料的价格,那么你就需要到一个一个的实现类里面去进行修改,严重违反了软件的设计原则。

tips:

代码应该如同晚霞中的莲花一样地关闭(免于改变),如同晨曦中的莲花一样地开放(能够扩展)。

设计原则:

类应该对扩展开放,对修改关闭。

这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。

注意:在选择需要被扩展的代码部分时要小心。每个地方都采用开放-关闭原则,是一种浪费,也没有必要,还会导致代码变得复杂且难以理解,要找到平衡点。

认识装饰者模式
在上面星巴兹咖啡的设计中,实现类数量爆炸、设计死板、以及基类加入新功能不适用于所有的子类。

用装饰者模式进行设计

拿一个深色烘焙咖啡(DarkRoast)对象

以摩卡(Mocha)对象装饰它

以奶泡(Whip)对象装饰它

调用cost()方法,并委托(delegate)将调料的价钱加上去

简单来讲就是将对象一层一层包起来,在调用的时候,先一层一层进去,之后一层一层计算结果出来。

定义装饰者模式
说明:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

使用装饰者模式设计星巴兹类图

注意:这里使用继承是达到“类型匹配”的目的(!!!),而不是利用继承来获得行为。

新咖啡师傅特训
如果有一张单子点的是:“双倍摩卡豆浆奶泡拿铁咖啡”,进行设计实现。

流程

核心代码实现

总抽象类,装饰类与被装饰类都实现此类,达到类型匹配

/**

  • @Description 抽象类饮料
  • @Author lh
  • @Date 2022/12/6 19:31
    */
    public abstract class Beverage {
    public String description = “Unknown Beverage”;

    public String getDescription() {
    return description;
    }

    public abstract double cost();
    }
    被装饰类,不同口味饮料

/**

  • @Description 意大利浓缩咖啡
  • @Author lh
  • @Date 2022/12/6 19:37
    /
    public class Espresso extends Beverage {

    public Espresso() {
    description = “Espresso”;
    }

    @Override
    public double cost() {
    return 1.99;
    }
    }
    /
    *
  • @Description 家庭混合咖啡
  • @Author lh
  • @Date 2022/12/6 19:39
    */
    public class HouseBlend extends Beverage {

    public HouseBlend() {
    description = “House Blend Coffee”;
    }

    @Override
    public double cost() {
    return .89;
    }
    }
    装饰抽象类

/**

  • @Description 装饰类调料抽象类
  • @Author lh
  • @Date 2022/12/6 19:35
    */
    public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
    }
    装饰类实现

/**

  • @Description 调料摩卡
  • @Author lh
  • @Date 2022/12/6 19:41
    /
    public class Mocha extends CondimentDecorator{
    private final Beverage beverage;

    public Mocha(Beverage beverage) {
    this.beverage = beverage;
    }

    @Override
    public String getDescription() {
    return beverage.getDescription() + “, Mocha”;
    }

    public double cost() {
    return .20 + beverage.cost();
    }
    }
    /
    *
  • @Description 调料奶泡
  • @Author lh
  • @Date 2022/12/6 19:51
    */
    public class Whip extends CondimentDecorator{
    private final Beverage beverage;

    public Whip(Beverage beverage) {
    this.beverage = beverage;
    }

    @Override
    public String getDescription() {
    return beverage.getDescription() + “, Whip”;
    }

    public double cost() {
    return .15 + beverage.cost();
    }
    }
    实现 双倍摩卡豆浆奶泡拿铁咖啡

/**

  • @Description 星巴兹计算
  • @Author lh
  • @Date 2022/12/6 20:10
    */
    public class StarbuzzCoffee {
    public static void main(String[] args) {
    Beverage beverage = new HouseBlend();
    System.out.println(beverage.getDescription() + “:” + beverage.cost() + “元”);

    Beverage beverage1 = new HouseBlend();
    beverage1 = new Mocha(beverage1);
    beverage1 = new Mocha(beverage1);
    beverage1 = new Whip(beverage1);
    System.out.println(beverage1.getDescription() + “:” + beverage1.cost() + “元”);
    }
    }
    真实世界的装饰者:Java I/O
    下面是一个典型的对象集合,用装饰者来将功能结合起来,以读取文件数据。

和星巴兹的设计相比,java.io其实并没有多大的差距。

核心代码示例

/**

  • @Description 获取文本行数
  • @Author lh
  • @Date 2022/12/7 19:34
    /
    public class LowerNumberInputStream extends FilterInputStream {

    public LowerNumberInputStream(InputStream in) {
    super(in);
    }

    public int read() throws IOException {
    int c = super.read();
    return (c == -1 ? c : Character.toLowerCase©);
    }

    public int read(byte[] b, int offset, int len) throws IOException {
    int result = super.read(b, offset, len);
    for (int i = offset; i < offset + result; i++) {
    b[i] = (byte) Character.toLowerCase(b[i]);
    }
    return result;
    }
    }
    /
    *
  • @Description IO测试
  • @Author lh
  • @Date 2022/12/7 19:40
    */
    public class InputTest {
    public static void main(String[] args) throws FileNotFoundException {
    int c;
    try {
    InputStream in = new LowerNumberInputStream(new BufferedInputStream(new FileInputStream(“text.txt”)));
    while ((c = in.read()) >= 0) {
    System.out.println©;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    总结
    装饰者和被装饰者对象有相同的超类型(类型匹配)。

你可以用一个或多个装饰者包装一个对象。

既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它。

装饰者可以在所委托被装饰者的行为之前与之后,加上自己的行为,以达到特定的目的。

对象可以在任何时候被装饰,所以可以在运行时动态地、不限量得使用你喜欢的装饰者来装饰对象。

【Android App】实战项目之仿微信的私信和群聊App(附源码)相关推荐

  1. 【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 手机最开始用于通话,后来增加了短信功能,初步满足了人与人之间的沟通需求.然而短信只能发文字,于是出现了能够发图片的彩信,但不管短信还是彩信,资费都太贵 ...

  2. Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 动感影集就是只要用户添加一张图片,动感影集就能给每张图片渲染不同的动画效果,让原本静止的图片变得活泼起来,辅以各种精致的动画特效,营造一种赏心悦目的感 ...

  3. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

    需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面. 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼 ...

  4. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)

    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...

  5. Android列表收缩与展开仿QQ好友列表(非常详细,附源码)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同 ...

  6. Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器,就是从一副图片中扣出用户想要的某块区域 一.需求描述 美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能.在A ...

  7. android仿qq折叠,android列表收缩与展开仿QQ好友列表(非常详细,附源码)

    好友QQ列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到android的E ...

  8. Flutter高仿微信-第47篇-群聊-语音

     Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 详情 ...

  9. Flutter高仿微信-第46篇-群聊-表情

    Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 详情请 ...

最新文章

  1. 阿里、拼多多P8面试分享!
  2. HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)
  3. 使用精确的Java方法参数
  4. frame框架 超链接
  5. 新书推荐 |《5G安全技术与标准》
  6. Elasticsearch aggregations API
  7. JavaScript的历史由来及简介
  8. Python基础知识 D3
  9. ckpt转pb,batch normalzition 出现的ValueError问题
  10. python 自动划分训练集和测试集
  11. echarts结合amap (echarts-extension-amap)
  12. 从 KPI 到 OKR,高阶产品人如何推动业务高速增长
  13. 开奖名单公布!百度超级链专属好礼有你一份,速戳!
  14. 罗克韦尔AB PLC 通过KEPServer实现与西门子1200PLC的以太网通信
  15. 部署开源LWM2M服务器 leshan
  16. js中百度地图API获取本地搜索全部结果自定义显示效果
  17. 刘德华--9风雨人生路
  18. java基础/java调用shell命令和脚本
  19. RecyclerView的万能分割线
  20. uniapp图片详情

热门文章

  1. Openssl ECC椭圆曲线算法 - 密钥/签名/验签/加密/解密/SM2密文 - 序列化反序列化导出导入 - C源码
  2. 流量/流速单位动态换算
  3. 选择可解释性高的机器学习模型,而不是决策风险高的黑匣子模型
  4. 联想10年: 沽空不断,市值徘徊,10亿股先生为何叫不醒?
  5. 基2fft实现、二次最佳平方逼近多项式、牛顿迭代法
  6. 精选国外知名网站手机版网页设计欣赏
  7. c语言按字节翻转无符号整数,C语言将一个无符号整数转换为任意d进制
  8. libwebsockets的学习
  9. 数组(入门最后一课)
  10. 合宙ESP32C3 更换Flash调整lua固件教程分享