设计模式-相关内容

文章目录

  • 一、设计模式概述
  • 二、UML图
    • 1.类的表示方法
    • 2.类与类之间关系的表示方法
      • (1)关联关系
      • (2)聚合关系
      • (3)组合关系
      • (4)依赖关系
      • (5)继承关系
      • (6)实现关系
  • 三、软件设计原则
    • 1.开闭原则
    • 2.里氏代换原则
    • 3.依赖倒转原则
    • 4.接口隔离原则
    • 5.合成复用原则
    • 6.迪米特法则

一、设计模式概述

创建型模式:用于描述怎样创建对象,它的主要特点是将对象的创建与使用分离。有单例、原型、工厂方法、抽象工厂、创建者等5种结构型模式:用于描述如何将类或对象按某种布局组成更大的结构。有代理、适配器、桥接、装饰、外观、享元、组合等7种行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。有模板方法、策略命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等11种

二、UML图

1.类的表示方法

在这里插入图片描述

包含 类名 属性 方法+ :表示public
- :表示private
# :表示protected

2.类与类之间关系的表示方法

(1)关联关系

是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系

单向关联

双向关联

自关联

(2)聚合关系

是关联关系的一种,是强关联关系,是整体和部分之间的关系

(3)组合关系

表示类之间的整体与部分关系,它是一种更强烈的聚合关系。整体对象可以控制部分对象的生命周期,
一旦整体对象不存在,部分对象也将不存在

(4)依赖关系

是一种使用关系,它是对象之间耦合度最弱的一种关联关系,是临时性的关联在代码中,某个类的方法通过局部变量、方法的参数或者静态方法的调用来访问另一个类中的某些方法来
完成一些职责

(5)继承关系

继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系
,是一种继承关系

(6)实现关系

实现关系是接口与实现类之间的关系

三、软件设计原则

1.开闭原则

对扩展开放,对修改关闭对程序需要进行拓展的时候,不能去修改原来的代码,要想做到这样需要使用接口和抽象类
/*** 抽象皮肤类*/
public abstract class AbstractSkin {//显示使用哪个皮肤public abstract void display();}/*** 默认皮肤类*/
public class DefaultSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("默认皮肤");}
}/*** 布布皮肤*/
public class BuBuSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("这是布布的皮肤");}
}/*** 输入法*/
public class YiErInput {private AbstractSkin skin;public void setSkin(AbstractSkin skin) {this.skin = skin;}public void display(){skin.display();}
}public class Client {public static void main(String[] args) {YiErInput input = new YiErInput();//AbstractSkin skin = new DefaultSkin();AbstractSkin skin = new BuBuSkin();input.setSkin(skin);input.display();}}

2.里氏代换原则

任何基类可以出现的地方,子类一定可以出现子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说子类继承父类时,
除添加新的方法完成新增功能外,尽量不要重写父类的方法

不复合里氏代换原则

/*** 长方形类*/
public class Rectangle {private double length;private double width;public double getLength() {return length;}public void setLength(double length) {this.length = length;}public double getWidth() {return width;}public void setWidth(double width) {this.width = width;}
}/*** 正方形类*/
public class Square extends Rectangle{@Overridepublic void setLength(double length) {super.setLength(length);super.setWidth(length);}@Overridepublic void setWidth(double width) {super.setLength(width);super.setWidth(width);}
}public class RectangleDemo {public static void main(String[] args) {//创建长方形对象Rectangle r = new Rectangle();r.setLength(10);r.setWidth(5);resize(r);printLengthAndWidth(r);System.out.println("===============");//创建正方形对象Rectangle s = new Square();s.setLength(10);//设置长和宽resize(s);printLengthAndWidth(s);}//扩宽方法public static void resize(Rectangle rectangle){//判断宽是否小于等于长,就进行扩宽while (rectangle.getWidth() <= rectangle.getLength()){rectangle.setWidth(rectangle.getWidth() + 1);}}//打印长和宽public static void printLengthAndWidth(Rectangle rectangle){System.out.println("长 : " + rectangle.getLength());System.out.println("宽 : " + rectangle.getWidth());}}

符合里氏代换原则

public interface Quadrilateral {double getLength();//获取长double getWidth();//获取宽}/*** 正方形*/
public class Square implements Quadrilateral{private double side;public double getSide() {return side;}public void setSide(double side) {this.side = side;}@Overridepublic double getLength() {return side;}@Overridepublic double getWidth() {return side;}
}/*** 长方形类*/
public class Rectangle implements Quadrilateral{private double length;private double width;public void setLength(double length) {this.length = length;}public void setWidth(double width) {this.width = width;}@Overridepublic double getLength() {return length;}@Overridepublic double getWidth() {return width;}
}public class RectangleDemo {public static void main(String[] args) {//创建长方形对象Rectangle r = new Rectangle();r.setLength(10);r.setWidth(5);resize(r);printLengthAndWidth(r);System.out.println("===============");//创建正方形对象Square s = new Square();s.setSide(10);//设置长和宽printLengthAndWidth(s);}//扩宽方法public static void resize(Rectangle rectangle){//判断宽是否小于等于长,就进行扩宽while (rectangle.getWidth() <= rectangle.getLength()){rectangle.setWidth(rectangle.getWidth() + 1);}}//打印长和宽public static void printLengthAndWidth(Quadrilateral quadrilateral){System.out.println("长 : " + quadrilateral.getLength());System.out.println("宽 : " + quadrilateral.getWidth());}}

3.依赖倒转原则

高层模块不应该依赖于底层模块,两者都应该依赖其抽象;抽象不应该依赖于细节,细节应该依赖于抽象。简单来说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合
/*** 硬盘接口*/
public interface HardDisk {//存储数据public void save(String data);//获取数据public String getData();
}public class XiJieHardDisk implements HardDisk{@Overridepublic void save(String data) {System.out.println("使用希捷硬盘存储数据为 : " + data);}@Overridepublic String getData() {System.out.println("使用希捷硬盘获取数据");return "data";}
}/*** cpu接口*/
public interface Cpu {public void run();//运行}public class IntelCpu implements Cpu{@Overridepublic void run() {System.out.println("使用intel处理器");}
}/*** 内存条接口*/
public interface Memory {public void save();}public class KingstonMemory implements Memory{@Overridepublic void save() {System.out.println("使用金士顿内存条");}
}public class Computer {private HardDisk hardDisk;private Cpu cpu;private Memory memory;public HardDisk getHardDisk() {return hardDisk;}public void setHardDisk(HardDisk hardDisk) {this.hardDisk = hardDisk;}public Cpu getCpu() {return cpu;}public void setCpu(Cpu cpu) {this.cpu = cpu;}public Memory getMemory() {return memory;}public void setMemory(Memory memory) {this.memory = memory;}//运行计算机public void run(){System.out.println("运行计算机");String data = hardDisk.getData();System.out.println("从硬盘上获取的数据是 : " + data);cpu.run();memory.save();}
}public class ComputerDemo {public static void main(String[] args) {//创建计算机对象Computer computer = new Computer();//创建计算机的组件HardDisk hardDisk = new XiJieHardDisk();//硬盘Cpu cpu = new IntelCpu();//cpuMemory memory = new KingstonMemory();//内存条//组装computer.setHardDisk(hardDisk);computer.setCpu(cpu);computer.setMemory(memory);//运行computer.run();}}

4.接口隔离原则

客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上
/*** 防盗接口*/
public interface AntiTheft {void antiTheft();}/*** 防火接口*/
public interface Fireproof {void fireproof();}/*** 防水接口*/
public interface Waterproof {void waterproof();}public class YourDoor implements AntiTheft,Fireproof,Waterproof{@Overridepublic void antiTheft() {System.out.println("防盗");}@Overridepublic void fireproof() {System.out.println("防火");}@Overridepublic void waterproof() {System.out.println("防水");}
}public class MyDoor implements Fireproof{@Overridepublic void fireproof() {System.out.println("只能防火");}
}public class DoorTest {public static void main(String[] args) {//创建安全门对象YourDoor yourDoor = new YourDoor();//功能yourDoor.antiTheft();yourDoor.fireproof();yourDoor.waterproof();System.out.println("---------------");MyDoor myDoor = new MyDoor();myDoor.fireproof();}}

5.合成复用原则

尽量先使用组合或者聚合等关联关系来实现,其次才考虑继承关系来实现通常类的复用分为继承复用和合成复用两种继承复用简单易实现,但有以下缺点:1.破坏了类的封装性,因为继承会将父类的实现细节暴露给子类,父类对子类是透明的2.父类与子类的耦合度高,父类的实现的任何改变都会导致子类的实现发生变化,不宜与类的扩展与维护3.它限制了复用的灵活性,从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化组合或聚合复用,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,
他有以下优点:1.它维持了类的封装性2.对象间的耦合度低,可以在类的成员位置声明为抽象3.复用的灵活性高,这种复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的对象

6.迪米特法则

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
其目的是降低类之间的耦合度,提高模块的相对独立性
/*** 明星类*/
public class Star {private String name;public Star(String name) {this.name = name;}public String getName() {return name;}
}/*** 粉丝类*/
public class Fans {private String name;public Fans(String name) {this.name = name;}public String getName() {return name;}
}/*** 媒体公司类*/
public class Company {private String name;public Company(String name) {this.name = name;}public String getName() {return name;}
}/*** 经纪人类*/
public class Agent {private Star star;private Fans fans;private Company company;public void setStar(Star star) {this.star = star;}public void setFans(Fans fans) {this.fans = fans;}public void setCompany(Company company) {this.company = company;}//和粉丝见面public void meeting(){System.out.println(star.getName() + " 和粉丝 " + fans.getName() + " 见面");}//和媒体公司合作public void business(){System.out.println(star.getName() + " 和 " + company.getName() + "" + " 合作");}
}public class Client {public static void main(String[] args) {//创建经纪人类Agent agent = new Agent();Star star = new Star("小红");Fans fans = new Fans("沙雕");Company company = new Company("巨坑人");agent.setStar(star);agent.setFans(fans);agent.setCompany(company);agent.meeting();agent.business();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/157296.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驾驶数字未来:汽车业界数字孪生技术的崭新前景

随着数字化时代的到来&#xff0c;汽车行业正经历着前所未有的变革。数字孪生技术&#xff0c;作为一种前沿的数字化工具&#xff0c;正在为汽车行业带来革命性的影响&#xff0c;不仅改变着汽车制造和维护的方式&#xff0c;也为消费者带来了前所未有的体验。让我们一起探讨&a…

[sqoop]hive导入mysql,其中mysql的列存在默认值列

一、思路 直接在hive表中去掉有默认值的了列&#xff0c;在sqoop导入时,指定非默认值列即可&#xff0c; 二、具体 mysql的表 hive的表 create table dwd.dwd_hk_rcp_literature(id string,literature_no string,authors string,article_title string,source_title string…

OLED透明拼接屏:福州鼓山风景区:徜徉于城市壮丽之

福州是中国福建省的省会城市&#xff0c;历史悠久&#xff0c;文化底蕴深厚。 该城市曾是唐宋时期的重要港口城市&#xff0c;也是丝绸之路海上丝绸之路的起点之一。 福州以其独特的地理位置和丰富的历史遗产而闻名于世。 福州拥有众多的历史景点&#xff0c;其中最著名的是…

MySQL为什么用b+树

索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量&#xff0c;数据量大了索引才显得有意义&#xff0c;如果我想要在[1,2,3,4]中找到4这个数据&#xff0c;直接对全数据检索也很快&am…

动态盘转换为基本盘

问题描述 不小心将磁盘0&#xff08;C和D是基本盘&#xff0c;蓝颜色&#xff09;改成了动态盘&#xff08;C和D是动态盘&#xff0c;橘黄色&#xff09;&#xff1f;如何修改回来呢&#xff1f; 解决方案&#xff1a; 使用DiskGenius将动态磁盘转换为基本磁盘 操作之前一定…

风电光伏混合储能功率小波包分解、平抑前后波动性分析、容量配置、频谱分析、并网功率波动分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【java|golang】多字段排序以及排序规则

奖励最顶尖的 K 名学生 给你两个字符串数组 positive_feedback 和 negative_feedback &#xff0c;分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。 一开始&#xff0c;每位学生分数为 0 。每个正面的单词会给学生的分数 加 3 分&#xff0c;每个负面的词…

智慧空开让用电更安全、管理更智能——电脑APP远程控制开合闸

安科瑞 崔丽洁 01 什么是低压断路器&#xff1f;低压断路器的定义是&#xff1a;能够接通、承载及分断正常电路条件下的电流&#xff0c;也能在规定的非正常电路条件&#xff08;过载、短路、特别是短路&#xff09;下接通、承载一定时间和分断电流的开关电器。 断路器的分类&…

拼多多商品品牌数据接口,拼多多商品详情数据接口,拼多多优惠券数据接口,拼多多API接口

拼多多商品品牌数据采集方法如下&#xff1a; 手动数据采集。直接在拼多多平台上搜索并手动复制商品数据&#xff0c;适合采集小批量的商品数据&#xff0c;但不适用于大规模数据采集。手动采集需要手动输入搜索词&#xff0c;进行筛选后再复制所需的数据&#xff0c;该方法需…

白银做期货还是做现货?

现货白银和期货白银都是保证金交易品种&#xff0c;都具有一定的资金杠杆&#xff0c;新手投资者在它们之间进行选择的时候&#xff0c;可能会遇到一定的困难&#xff0c;但是只要投资者真正了解过它们的区别&#xff0c;在选择时思路就会更加清晰&#xff0c;能够根据自己的实…

Stable Diffusion XL搭建

本文参考&#xff1a;Stable Diffusion XL1.0正式发布了&#xff0c;赶紧来尝鲜吧-云海天教程 Stable Diffision最新模型SDXL 1.0使用全教程 - 知乎 1、SDXL与SD的区别 &#xff08;1&#xff09;分辨率得到了提升 原先使用SD生成图片&#xff0c;一般都是生成512*512&…

VMWare配置桥接

一、设置网络模式 二、编辑网卡配置 ip配置的子网掩码和默认网关保持和宿主机一致&#xff0c;ip局域网内不冲突。 # cd /etc/sysconfig/network-scriptslsvim ifcfg-ens160 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOnone DEFROUTEyes IPV4_FAILURE_FATALno IP…

hive 之select 中文乱码

此处的中文乱码和mysql的库表 编码 latin utf 无关。 直接上案例。 有时候我们需要自定义一列&#xff0c;有时是汉字有时是字母&#xff0c;结果遇到这种情况了。 说实话看到这真是糟心。这谁受得了。 单独select 没有任何问题。 这是怎么回事呢&#xff1f; 经过一番检查&…

C++11新特性(lambda,可变参数模板,包装器,bind)

lambda表达式是什么&#xff1f;包装器又是什么&#xff1f;有什么作用&#xff1f;莫急&#xff0c;此篇文章将详细带你探讨它们的作用。很多同学在学习时害怕这些东西&#xff0c;其实都是方便使用的工具&#xff0c;很多情况下我们学这些新的东西觉得麻烦&#xff0c;累赘&a…

服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

linux C++ vscode连接mysql

1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…

MySQL 安装+启动+报错的解决方案

目录 一、安装准备 1.1 下载 1.2 版本说明 二、安装步骤 2.1 解压缩 2.2 配置环境变量 2.3 配置文件 2.4 安装 2.5 启动/停止服务 三、使用说明 3.1 用户名密码登录 3.1 设置用户名密码 四、卸载步骤 4.1 卸载服务 五、安装问题 六、启动问题 6.1 提示【服务无…

Docker部署gitlab_ce(避坑版---社区版)

1 下载docker 2 下载gitlab镜像 3 运行 4 进入容器内部修改 5 在浏览器里访问 6 修改root密码&#xff08;如果忘记请修改&#xff09; 1 下载docker # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2# 设置yum源 yum-config-manager --add-repo https…

国内ITSM发展的趋势

多年来&#xff0c;随着客户业务需求、工作文化、技术创新的不断变化以及新的IT环境的出现&#xff0c; IT支持也出现了新的变化&#xff0c;由单一的IT帮助台&#xff08; IT help desk&#xff09;逐渐转变为了综合性的IT服务台&#xff08; IT service desk&#xff09;&…

Vulnhub系列靶机---Raven: 2

文章目录 信息收集主机发现端口扫描目录扫描用户枚举 漏洞发现漏洞利用UDF脚本MySQL提权SUID提权 靶机文档&#xff1a;Raven: 2 下载地址&#xff1a;Download (Mirror) 信息收集 靶机MAC地址&#xff1a;00:0C:29:15:7F:17 主机发现 sudo nmap -sn 192.168.8.0/24sudo arp…