【设计模式】—— 适配器模式Adapter
时间:2022-04-22
本文章向大家介绍【设计模式】—— 适配器模式Adapter,主要内容包括模式意图、模式结构、使用场景、生活中的设计模式、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模式意图
如果已经有了一种类,而需要调用的接口却并不能通过这个类实现。因此,把这个现有的类,经过适配,转换成支持接口的类。
换句话说,就是把一种现有的接口编程另一种可用的接口。
模式结构
【类的适配器】
Target 目标接口
Adaptee 现有的类
Adapter 中间转换的类,即实现了目标接口,又继承了现有的类。
1 package com.xingoo.test1;
2 interface Target{
3 public void operation1();
4 public void operation2();
5 }
6 class Adaptee{
7 public void operation1(){
8 System.out.println("operation1");
9 }
10 }
11
12 class Adapter extends Adaptee implements Target{
13 public void operation2() {
14 System.out.println("operation2");
15 }
16 }
17
18 public class test {
19 public static void main(String[] args){
20 Target tar = new Adapter();
21 tar.operation1();
22 tar.operation2();
23 }
24 }
【对象的适配器】
与上面不同的是,这次并不是直接继承现有的类,而是把现有的类,作为一个内部的对象,进行调用。
1 package com.xingoo.test2;
2
3 interface Target{
4 public void operation1();
5 public void operation2();
6 }
7
8 class Adaptee{
9 public void operation1(){
10 System.out.println("operation1");
11 }
12 }
13
14 class Adapter implements Target{
15 private Adaptee adaptee;
16 public Adapter(Adaptee adaptee){
17 this.adaptee = adaptee;
18 }
19 public void operation1() {
20 adaptee.operation1();
21 }
22
23 public void operation2() {
24 System.out.println("operation2");
25 }
26
27 }
28 public class test {
29 public static void main(String[] args){
30 Target tar = new Adapter(new Adaptee());
31 tar.operation1();
32 tar.operation2();
33 }
34 }
使用场景
1 想使用一个已经存在的类,但是它的接口并不符合要求
2 想创建一个可以复用的类,这个类与其他的类可以协同工作
3 想使用已经存在的子类,但是不可能对每个子类都匹配他们的接口。因此对象适配器可以适配它的父类接口。(这个没理解,以后慢慢琢磨)
生活中的设计模式
俗话说,窈窕淑女君子好逑,最近看跑男,十分迷恋Baby。
但是,如果桃花运浅,身边只有凤姐,那么也不需要担心。
只需要简单的化妆化妆,PS一下,美女凤姐,依然无可替代!
虽然,没有AngleBaby,但是我们有凤姐,所以依然可以看到AngleBaby甜美的笑。
1 package com.xingoo.test3;
2 interface BeautifulGirl{
3 public void Smiling();
4 }
5 class UglyGirl{
6 public void Crying(){
7 System.out.println("我在哭泣...");
8 }
9 }
10 class ApplyCosmetics implements BeautifulGirl{
11 private UglyGirl girl;
12 public ApplyCosmetics(UglyGirl girl){
13 this.girl = girl;
14 }
15 public void Smiling() {
16 girl.Crying();
17 }
18 }
19 public class test {
20 public static void main(String[] args){
21 BeautifulGirl girl = new ApplyCosmetics(new UglyGirl());
22 girl.Smiling();
23 }
24 }
运行结果
我在哭泣...
- 网页中显示xml,直接显示xml格式的文件
- 【编程题】Java编程题一(10道)
- 【学习笔记】springboot教程(1)第一个demo
- Hyperledger Fabric 积分代币上链方案
- MySQL中的事务和锁简单测试(r10笔记第46天)
- 数据库无响应问题的紧急处理和分析 (r10笔记第42天)
- 【转载】记Golang数据库查询封装的坑
- Golang 基本语法学习笔记之流程控制
- Go 语言的演化历程
- JS 评分五角星随鼠标移动显示
- Golang标准库学习——buffio包 ---转
- 【Go 语言社区】Go语言条件变量的两个例子
- mysqlimport导入报错的排查(r10笔记第58天)
- 【Go 语言社区】POJ 1047 Round and Round We Go 循环数新解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringBoot拦截器的简单使用
- dotNET Core:编码规范
- K8s——Ingress-nginx原理及配置
- Java的类加载器
- 如何启动HiveServer2
- dotnet 如何调试 SmartSql 的实际执行 SQL 语句
- dotnet 关于 SmartSql 的 SQL 语句的属性替换前缀说明
- 为什么java初学者要学习一点前端技术?
- Expedition (POJ 2431)
- java JVM 报C [libresolv.so.2+0x7e7d] __libc_res_nquery+0x4dd 解决
- Fence Repair (PKU 3253)
- JAVA 初学者的编码规范一:命名风格与代码格式
- Leetcode No.11 盛最多水的容器
- OpenCV图像拼接函数vconcat()&hconcat()
- JAVA自定义注解