- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java适配器模式之万物拟人化由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
以下是百科的解释.
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.
共有两类适配器模式:
- 类适配器模式:
这种适配器模式下,适配器继承自已实现的类(一般多重继承).
- 对象适配器模式:
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象.
设计模式和编程语言无关,但是二当家的依然用Java语言去实战举例.
- 源(Adapee)角色:现在需要适配的接口。
- 目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
- 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
二当家喜欢狗狗,所以养了一只狗狗,他有时候会发出叫声.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.secondgod.adapter;
/**
* 狗狗
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Dog {
/**
* 发出声音
*/
public
void
makeSound() {
System.out.println(
"狗狗:汪汪汪。。。。。。"
);
}
}
|
我们会和朋友聊天说话.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
com.secondgod.adapter;
/**
* 朋友
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
interface
IFriend {
/**
* 说话
*/
void
speak();
}
|
过了一段时间,二当家把狗狗当成了朋友,觉得它不是在叫,而是在说话.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package
com.secondgod.adapter;
/**
* 狗狗朋友
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
DogFriend
extends
Dog
implements
IFriend {
/**
* 说话了
*/
@Override
public
void
speak() {
super
.makeSound();
}
}
|
我们测试一下和狗狗朋友的说话.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
com.secondgod.adapter;
/**
* 人
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Person {
/**
* 和朋友聊天
*
* @param friend
*/
public
void
speakTo(IFriend friend) {
System.out.println(
"人:朋友,你干什么呢?"
);
friend.speak();
}
public
static
void
main(String[] args) {
Person person =
new
Person();
IFriend friend =
new
DogFriend();
person.speakTo(friend);
}
}
|
二当家的说一句,狗狗叫一声,我们真的像是在聊天.
有一天,二当家的又养了一只猫猫.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.secondgod.adapter;
/**
* 猫猫
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Cat {
/**
* 发出声音
*/
public
void
makeSound() {
System.out.println(
"猫猫:喵喵喵。。。。。。"
);
}
}
|
过了几天,二当家的和猫猫也成了朋友。这时候只好再多增加一个猫朋友类.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package
com.secondgod.adapter;
/**
* 猫猫朋友
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
CatFriend
extends
Cat
implements
IFriend {
/**
* 说话了
*/
@Override
public
void
speak() {
super
.makeSound();
}
}
|
二当家的和狗朋友,猫朋友聊天.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
com.secondgod.adapter;
/**
* 人
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Person {
/**
* 和朋友聊天
*
* @param friend
*/
public
void
speakTo(IFriend friend) {
System.out.println(
"人:朋友,你干什么呢?"
);
friend.speak();
}
public
static
void
main(String[] args) {
Person person =
new
Person();
IFriend dogFriend =
new
DogFriend();
IFriend catFriend =
new
CatFriend();
person.speakTo(dogFriend);
person.speakTo(catFriend);
}
}
|
以后要是二当家的再有其他动物朋友,就需要再去增加适配器类。有没有办法通用一点呢?
二当家的希望可以有一个和各种动物做朋友的办法,而不是每次有了新的动物朋友都需要增加一个适配器.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.secondgod.adapter;
/**
* 动物
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
interface
IAnimal {
/**
* 发出声音
*/
void
makeSound();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.secondgod.adapter;
/**
* 狗狗
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Dog
implements
IAnimal {
/**
* 发出声音
*/
public
void
makeSound() {
System.out.println(
"狗狗:汪汪汪。。。。。。"
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.secondgod.adapter;
/**
* 猫猫
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Cat
implements
IAnimal {
/**
* 发出声音
*/
public
void
makeSound() {
System.out.println(
"猫猫:喵喵喵。。。。。。"
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package
com.secondgod.adapter;
/**
* 万物拟人适配器
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
AnimalFriendAdaper
implements
IFriend {
/**
* 被拟人化的动物朋友
*/
private
IAnimal animal;
public
AnimalFriendAdaper(IAnimal animal) {
this
.animal = animal;
}
@Override
public
void
speak() {
animal.makeSound();
}
}
|
测试我们的万物拟人适配器.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package
com.secondgod.adapter;
/**
* 人
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
Person {
/**
* 和朋友聊天
*
* @param friend
*/
public
void
speakTo(IFriend friend) {
System.out.println(
"人:朋友,你干什么呢?"
);
friend.speak();
}
public
static
void
main(String[] args) {
// 一个人
Person person =
new
Person();
// 一只狗
IAnimal dog =
new
Dog();
// 一只猫
IAnimal cat =
new
Cat();
// 万物拟人
person.speakTo(
new
AnimalFriendAdaper(dog));
person.speakTo(
new
AnimalFriendAdaper(cat));
}
}
|
太好了。和动物做朋友轻松多了。因为有了万物拟人的适配器.
有一天,朋友的标准变了。必须得会码砖才行.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package
com.secondgod.adapter;
/**
* 朋友
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
interface
IFriend {
/**
* 说话
*/
void
speak();
/**
* 码起来
*/
void
coding();
}
|
修改后的万物拟人适配器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package
com.secondgod.adapter;
/**
* 万物拟人适配器
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
AnimalFriendAdaper
implements
IFriend {
/**
* 被拟人化的动物朋友
*/
private
IAnimal animal;
public
AnimalFriendAdaper(IAnimal animal) {
this
.animal = animal;
}
@Override
public
void
speak() {
animal.makeSound();
}
@Override
public
void
coding() {
System.out.println(
"动物:笑而不语摇摇头。。。。。。"
);
}
}
|
二当家的想和动物做朋友,但是不想去考虑他们如何码砖,以后二当家的要是和植物做朋友,还得为植物朋友也实现码砖行为,烦哦。所以我们来个默认空实现.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package
com.secondgod.adapter;
/**
* 缺省适配器
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
abstract
class
FriendAdaper
implements
IFriend {
@Override
public
void
speak() {
}
@Override
public
void
coding() {
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package
com.secondgod.adapter;
/**
* 万物拟人适配器
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public
class
AnimalFriendAdaper
extends
FriendAdaper {
/**
* 被拟人化的动物朋友
*/
private
IAnimal animal;
public
AnimalFriendAdaper(IAnimal animal) {
this
.animal = animal;
}
@Override
public
void
speak() {
animal.makeSound();
}
}
|
由于多了一个默认实现,我们就不需要为万物适配器实现码砖行为了.
适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现.
在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样,从这个抽象类再继承下去的子类就不必实现所有的方法了.
到此这篇关于java适配器模式之万物拟人化的文章就介绍到这了,更多相关java适配器模式内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/leyi520/article/details/119730567 。
最后此篇关于java适配器模式之万物拟人化的文章就讲到这里了,如果你想了解更多关于java适配器模式之万物拟人化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!