Java 帝国之建造者模式

帝国竞争算法(imperialist competitive algorithm, ICA )详解+Java代码实现 前言 这段时间用过这个算法做过相关的工作,今天就介绍一下吧。虽然感觉效果嘛,勉勉强强啦。不过每种算法肯定有其适用的地方,用到了就Mark一下方便后人吧~ 介绍 帝国竞争算法(imperialist competitive algorithm,ICA)是Atashpaz-Gargari和Lucas于2007年提出的一种基于帝国主义殖民竞争机制的进化算法,属于社会启发的随机优化搜索方法。目前,ICA已被成功应用于多种优化问题中,如调度问题、分类问题和机械设计问题等。[2] 帝国主义竞争算法,借鉴了人类历史上政治 阅读详情

本文来自王钦誉的投稿,老刘做了较大修改。

原文地址:

https://xiaoqinyu0000.github.io/2018/06/11/Java/JavaBuilder/

据说在帝国建立初期,人类眼里的Java程序就是一个黑乎乎的命令行窗口,里面显展示着大片大片的代码和文字。

那是一个灰暗的年代, 几乎没有人愿意天天与这些黑窗口打交道。

国王决心让帝国变得多姿多彩,于是下令建立图形村,研究Java的图形和图像。

经过艰苦卓绝的努力,我们掌握了GUI编程的核心技术,帝国终于可以在人类设备上展示图形界面了。 

99个重载函数

我是图形村的一个代表,专门对外提供一种图形: Square(正方形)

给你看看我最近接的几个单子:

640?wx_fmt=png

用户一的需求是一个50 * 50的蓝色正方形;

用户二的需求是一个50 * 50的蓝色正方形,还要一个黑色的边框;

…....

Square对象可以很简单(例如用户一要的就是一个蓝色的正方形),也可以非常复杂(形状、颜色、大小、边框、阴影、层次等等)。

用户需要什么样的图形,只需要把对应的属性(长、宽、颜色...)告诉我就行...

 1class Square {
 2    public Square(int size, int color) { ... }
 3
 4    public Square(int size, int color, int borderColor) { ... }
 5
 6    public Square(int size, int color, int borderColor, float radius) { ... }
 7
 8    public Square(int size, int color, int borderColor, float radius, float strokeDashGap) { ... }
 9
10    public Square(int size, int color, int borderColor, float radius, float strokeDashGap, float shadow) { ... }
11    ......
12}

(友情提示:可左右滑动)

为此,一个Square的构造函数, 我整整重载了99次!

不过带来的好处就是不管用户想要一个什么样的图形,只需调用一个方法,一行代码就可以搞定啦。

比如,用户1想要一个50*50的蓝色正方形,你需要给我3个参数便可以获得Square对象:

  • 大小:50 * 50

  • 颜色:Color.Blue

Square square = new Square(50, Color.Blue);

想再加一个黑色边框,只需要增加一个参数就行:

  • 边框:Color.Black

Square square = new Square(50, Color.Blue, Color.Black);

仅需一行代码就可以拿到Square对象,然后就可以在人类的设备上显示图形啦。

没有什么是一个重载方法解决不了的,如果有,那就两个重载方法…

每当有人抱怨说,从你这99个方法中找到一个合适的方法实在是太难了!  我就扔给他一个文档,里边详细描述着每个方法的参数,含义,只要读一遍,绝对没问题!

我的坚持引发了大家的怨气,当抱怨的人越来越多,我有点慌了,赶紧去找村长,希望他能给出点注意。

新设计

村长看了一会儿我的API,叹了口气说:“怪不得人家抱怨,你看看你的设计!”

Square square = new Square(50, Color.Red, Color.Blue, 5, Color.Black, 4, 9, Color.Red, 4, 8);

我一瞧,有什么奇怪的嘛?不就是创建一个Square对象吗?

他指着这行代码:“你看这行代码,能够清晰得知道要的是怎么样的图形吗?假设要你把阴影颜色改了,你知道改哪个值吗?”

我说:“稍等,我查下文档。”

3分钟后我说:“好像是改第5个参数吧。”

“每次用你的服务都要去查文档,从N个重载方法里找到对应所需的方法,再看看每个属性的含义,你觉得好用吗?” 村长厉声斥责。

我心想,这确实是问题,然而世间之事哪能十全十美呢?

我叹了口气:“Square 是复杂对象, 有很多属性和组合方式…有形状、颜色、长宽、边框、阴影、内外边距….”。

“你啊,真是不思进取,你想想,还有什么好的设计? ”

我说:“也许可以做出这样? ”

1class Square {
2    public Square() {...}
3    public void setSize(int size) {...}
4    public void setColor(int color) {...}
5    public void setBorderSize(int size) {...} 
6    public void setBorderColor(int color) {...}
7    public void setPadding(int left, int top, int right, int bottom) {...}
8    ...
9}

(友情提示:可左右滑动)

1Square square = new Square();
2square.setColor(Color.Blue);
3square.setBorderSize(5);
4square.setBorderColor(Color.Black);

如何对参数进行检查?

村长说:“这其实是一种类似JavaBean的方法, 比之前好了一点,但是你想过这个问题没有? 假设一些属性依赖另外一些属性,如果设置了属性A,但是没有设置属性B,那Square对象其实是有问题的,对于这种情况,你怎么处理?你在什么地方检查这种互相依赖的逻辑? ”

村长一下子就击中我的要害了,果然有两下子。

我赶紧请教:“您有何高见?”

村长说道:“你可以开放一个静态内部类专门用来与外界打交道,来收集用户想要设置的参数并且做检查。”

 1class Square {
 2
 3    private int color;
 4    private int borderSize;
 5    ......
 6    //private,让外面无法直接创建
 7    private Square(Builder builder) {    
 8        this.color = builder.color;
 9        this.borderSize = builder.borderSize;
10        ......
11    }
12
13    public static class Builder {
14        private int color;
15        private int borderSize;
16        ......
17
18        public void setColor(int color) { }
19        public void setBorderSize(int size) { }    //边框大小
20        public void setBorderColor(int color) { }    //边框颜色
21        public void setPadding(int left, int top, int right, int bottom) { }
22        ...
23
24        public Square build() {
25            ...检查参数之间的关系是否设置正确...
26            return new Square(this);
27        }
28    }
29}

看到这个代码,我已经不由自主地在纸上模拟用户的使用场景了:


1Square.Builder builder = new Square.Builder();
2builder.setSize(50);
3builder.setColor(Color.Blue);
4builder.setBorderSize(5);
5builder.setBorderColor(Color.Black); 
6//在build方法中会检查参数是否正确。
7Square square = builder.build();

可是这个调用方式可是比我之前提供的API复杂得多呀!如果旧的API,只用一行代码就可以可以了!

链式调用

村长似乎看到了我的疑惑,笑了笑问到:”你知道链式调用吗?“。

紧接着,他又展示了一段代码,里面静态内部类Builder的所有设置属性的方法的返回值居然变了:

 1class Square {
 2    ...
 3    public static final class Builder {
 4        public Builder setColor(int color) {
 5            ......
 6            return this;
 7        }
 8        public Builder setBorderSize(int size) {
 9            ......
10            return this;
11        }
12        public Builder setBorderColor(int color) {
13            ......
14            return this;
15        }
16        public Builder setPadding(int left, int top, int right, int bottom) {
17            ......
18            return this;
19        }
20        ...
21        public Square build() {
22            ...检查参数之间的关系是否设置正确...
23            return new Square(this);
24        }
25    }
26}

每一个Builder都返回了一个this,可是这又有什么用呢。

结合之前对方说的链式调用,我内心突然想到某种可能!

赶紧对之前调用方式的Demo做了一点修改:

1Square square = new Square.Builder()
2    .setSize(50)
3    .setColor(Color.Blue)
4    .setBorderSize(5)
5    .setBorderColor(Color.Black)
6    .build();

居然用一行代码就完成了调用,而且每个方法和属性都是如此得清晰、如此的明了,让人陶醉其中,不能自拔!

“看来,好的API设计远远重要于一份面面俱到的文档。” 我不由地感慨。

建造者模式

村长说道:“是啊,其实这种方式有个名称,叫做建造者模式! 对于你这个场景很适用。”

“Builder模式? 23种设计模式之一, 我学习过,好像不是这样的啊?”  说着我展示了一个UML 类图。

640?wx_fmt=png

“真是死脑筋,我们这个是个简化版嘛!你看看这个图,Client 可以认为就是Director, 对于Builder,我们没有没有接口,直接就是具体类。 核心思想还是一样的嘛!”

640?wx_fmt=png

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身文章精华》


Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar Java手机游戏--帝国时代.jar 立即下载

相关推荐

帝国时代2开源克隆版OpenAge.zip

OpenAge 是想做一个【帝国时代2】游戏引擎的开源克隆版。主要针对 POSIX 平台,如 GNU / Linux。这个项目同时也是想向 OpenMW、OpenRA 和 OpenTTD 三个项目学习。 OpenAge用的技术 C 11 引擎内核Python 脚本、媒体转换、控制台、代码生成CMake 构建系统OpenGL2.1 渲染, shadersSDL2 跨平台 Audio/Input/Window 处理Opus 音频解码Humans Mixing together all of the above 标签:OpenAge

JAVA--帝国的崛起(JAVA的发展历程)

(1972-1995)C语言帝国的统治 这是一个人人编程的世界,不同的帝国拥有着不同的编程语言 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。 1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲, 无数程序员臣服在他的脚下。帝国给我们提供了极好的福利:贴近硬件, 运行极快, 效率极高。 使用这些福利, 程序员们用C 开发了很多系统级软件,操作系统, 编译器, 数据库,网络系统..... 但是帝国也给我们安上了两个沉

weixin_62061392的博客 1002

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1182

java帝国复兴_Java 帝国之建造者模式

王钦誉本文转自公众号:码农翻身据说在帝国建立初期,人类眼里的Java程序就是一个黑乎乎的命令行窗口,里面显展示着大片大片的代码和文字。那是一个灰暗的年代, 几乎没有人愿意天天与这些黑窗口打交道。国王决心让帝国变得多姿多彩,于是下令建立图形村,研究Java的图形和图像。经过艰苦卓绝的努力,我们掌握了GUI编程的核心技术,帝国终于可以在人类设备上展示图形界面了。99个重载函数我是图形村的一个代表,专门...

weixin_39580727的博客 260

宜搭,高级认证实操2,FaaS连接器指导教程

找到FaasEntry.java将如下代码整体替换,注意引包。如图所示在util下新建EDSUtil.java代码如下。回到连接器界面点击右上角测试-->测试。连接器工厂-->新建FaaS连接器。保存-->前往云IDE开发。返回如图所示代码,部署成功。

2301_80286061的博客 3343

HC32 CAN通信

qqa

zhaopenglihui的博客 5436

类似帝国时代的java游戏_有哪些类似《帝国时代》系列的好游戏推荐?

既然是类似“帝国时代”,那我个人首先把魔兽3等有英雄,有主动技能的即时战略游戏排除,因为我个人认为适合人群不完全一致。而《地球帝国》和帝国时代虽像,但除了时代多,跨度大,其实和帝国时代区别比较小。所以我在这里推荐《神话时代》。这个是原版封面,后来还有资料片,建议直接下载最新的资料片“龙之传说”我只说几个亮点,当然是和《帝国时代2》比较,因为时代相对同期。(PS:才知道后来又出了个中国文明,由于未玩...

weixin_36253537的博客 561

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1020

别再手动查资料了!我用千帆AppBuilder的RAG组件,5分钟搞定技术博客大纲

本文介绍了如何利用千帆AppBuilder的RAG组件快速生成技术博客大纲,显著提升写作效率。通过RAG技术,创作者可在5分钟内获取包含技术演进、核心原理和框架对比的完整大纲,并自动标注权威参考文献来源。千帆AppBuilder的多源知识融合和动态更新功能,使技术写作从资料收集到结构梳理变得高效智能。

weixin_33694172的博客 362

瑞萨 RL78 开发环境实战:从 CS+ for CC 到 e² studio 高效开发

本文详细介绍了瑞萨RL78单片机开发环境的选择与配置,对比分析了CS+ for CC和e² studio的特点及适用场景。内容涵盖环境安装、工程创建、调试技巧、外设驱动开发和低功耗设计等实战经验,为开发者提供全面的RL78入门指南,帮助快速上手并高效开发。

4k5l6j7h8的博客 243

SIWAVE+ADS提取PCB走线寄生参数

本文将介绍一种很适合PCB走线提取寄生电感等参数的方法,即是通过SIWAVE将PCB走线的S参数提取出来,再通过ADS将S参数转换成电感、电容值。

sinat_15150363的博客 1765

Java 帝国对 Python 的渗透能成功吗?

作者 |刘欣 责编 | 屠敏 本文经授权转载自码农翻身(ID:coderising) 5G之后,中国的人工智能发展趋势如何? https://edu.youkuaiyun.com/topic/ai30?utm_source=csdn_bw 引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何...

优快云资讯 5829

手把手教你学PCIE(9.3)--pcie常见故障及原因:配置错误介绍

PCIe 设备的配置错误可能涉及操作系统设置、BIOS 设置、驱动程序设置和配置文件设置等多个方面。通过以上方法,可以有效地诊断和解决 PCIe 设备的配置错误。

MHD0815的博客 2440

邪恶的Java帝国是怎么欺负小函数的?

1小函数的运气不好,投胎到了邪恶的Java帝国,一出生就被告知了自己的悲惨地位,以及未来的悲惨人生:奴隶。确切地说,是类的奴隶。在Java帝国, 国王特别喜欢“类”, 不...

码农翻身 2134

微信对话开放平台智能对话模块的几个亮点

微信AI首席科学家牛成公布了最新开放方案,并重磅宣布全面开放各层次 NLP 能力。具体说来,微信 AI 迈出了“三大步”: 以硬件合作为核心的智言小微硬件开放平台 2.0 正式亮相; 公开以对话开放能力为核心的微信对话开放平台; 全面开放以自然语言处理能力为核心的 NLP 基础技术平台。 参考:微信9年:张小龙指明方向,微信AI全面开放NLP能力 今天公开课上隆重介绍了...

素质云笔记 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java : 一个帝国的诞生

Java基础 idea安装教程 java

sunyingboaini的博客 450

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java帝国的崛起

1 C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。  1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲,  无数程序员臣服在他的脚下。 帝国给我们提供了极好的福利:贴近硬件,  运行极快, 效率极高。   使用这些福利...

neverstopagain的博客 165

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

神秘使者到Java帝国传道协程,竟被轰了出去

作者|轩辕之风O来源 |编程技术宇宙(ID:xuanyuancoding)头图 | 优快云下载自东方IC神秘使者“久闻Java语言跨越平台,框架众多,不过二十年功夫,就已晋升...

优快云资讯 3098

黑客帝国里的代码雨-java代码实现

       我一直很好奇黑客帝国里的代码雨,感觉很酷,就一直搜集资料,尝试使用Java来实现,终于成功了,分享一下啊       代码雨的实现用到的是jdk自身带的类库,可能很多小伙伴不知道Java安装JDK就可以做C/S(客户/服务器)桌面应用软件开发,现在使用较多的是B/S(浏览器/服务器)模式。好了闲话少叙,只要你的的电脑支持桌面显示(Linux服务器纯命令行除外),那么ni只需要安装好...

m0_37732829的博客 1万+

学习java之java帝国的诞生

Java : 一个帝国的诞生 C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。 1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲, 无数程序员臣服在他的脚下。 帝国给我们提供了极好的福利:贴近硬件, 运行极快, 效率极高。 使用这些福利, 程序员们用C 开发了很多系统级软件,操作系统, 编译器, 数据库,网络系统… 但是帝国也给我们安上了两个沉重的枷锁: 指针和内存管理 虽然指针无比强大, 能直接操作内存,

Fcglywaj的博客 266

Canvas魔法之黑客帝国特效

今天我们实现黑客帝国(The Matrix)风格的字母掉落效果。 使用工具:Chrome浏览器(或其他支持H5的浏览器) 使用语言:HTML + JavaScript + Canvas + requestAnimationFrame

Java 技术专栏,从入门到精通,熟悉企业级开发 6283
上一篇: 我把这两年的精华文章都整理出来了
下一篇: ReactJS :我就是想把代码和HTML混在一起!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值