首页 文章 精选 留言 我的

精选列表

搜索[数据库设计],共10000篇文章
优秀的个人博客,低调大师

设计模式(八)代理模式(结构型)

概述 为其他对象提供一种代理以控制对这个对象的访问。 抽象角色:声明真实对象和代理对象的共同接口; 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。 类图 代码 IGamePlayer接口对游戏玩家进行抽象: 1 public interface IGamePlayer { 2 public void killBoss(); 3 public void UpGrade(); 4 } GamePlayer实现IGamePlayer接口中的方法: 1 public class GamePlayer implements IGamePlayer { 2 private String name = null; 3 public GamePlayer(String name) { 4 super(); 5 this.name = name; 6 } 7 @Override 8 public void killBoss() { 9 System.out.println(this.name+"正在killBoss"); 10 } 11 @Override 12 public void UpGrade() { 13 System.out.println(this.name+"突然UpGrade"); 14 } 15 } GamePlayerProxy是代理类: 1 public class GamePlayerProxy implements IGamePlayer { 2 private IGamePlayer player = null; 3 public GamePlayerProxy(IGamePlayer player) { 4 super(); 5 this.player = player; 6 } 7 // 记录日志 8 private void log() { 9 System.out.println(new Date().toString() + "的时候在打怪"); 10 } 11 @Override 12 public void killBoss() { 13 this.log(); 14 player.killBoss(); 15 } 16 @Override 17 public void UpGrade() { 18 player.UpGrade(); 19 this.count(); 20 } 21 private void count() { 22 System.out.println("升了1级"); 23 } 24 } 测试: 1 public class Main { 2 public static void main(String[] args) { 3 IGamePlayer player = new GamePlayer("张三"); 4 IGamePlayer proxy = new GamePlayerProxy(player); 5 proxy.killBoss(); 6 proxy.UpGrade(); 7 } 8 } 优点 职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。 高扩展性 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3857245.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

设计模式(六)建造者(创建型)

概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 类图 代码 public abstract class Computer { private String type; private String cpu; private String ram; private String os; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getRam() { return ram; } public void setRam(String ram) { this.ram = ram; } public String getOs() { return os; } public void setOs(String os) { this.os = os; } } 创建两种型号的计算机: public class T410 extends Computer { private String hardDisk; public T410() { this.setType("ThinkPad T410i"); } public String getHardDisk() { return hardDisk; } public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } @Override public String toString() { return "T410 [hardDisk=" + hardDisk + ", getType()=" + getType() + ", getCpu()=" + getCpu() + ", getRam()=" + getRam() + ", getOs()=" + getOs() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + "]"; } } public class X201 extends Computer { public X201() { this.setType("Thinkpad X201i"); } @Override public String toString() { return "X201 [getType()=" + getType() + ", getCpu()=" + getCpu() + ", getRam()=" + getRam() + ", getOs()=" + getOs() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + "]"; } } 在计算机产品类的基础上增加一个ComputerBuilder接口,以及两个的实现类,以便对计算机进行生产: public interface ComputerBuilder { void buildCpu(); void buildRam(); void buildHardDisk(); void BuildOs(); Computer getResult(); } public class T410Builder implements ComputerBuilder { private T410 computer = new T410(); @Override public void buildCpu() { computer.setCpu("i5"); } @Override public void buildRam() { computer.setRam("4G"); } @Override public void buildHardDisk() { computer.setHardDisk("500G"); } @Override public void BuildOs() { computer.setOs("Win7"); } @Override public Computer getResult() { return computer; } } public class X201Builder implements ComputerBuilder { private X201 computer = new X201(); @Override public void buildCpu() { computer.setCpu("i7"); } @Override public void buildRam() { computer.setRam("8G"); } @Override public void buildHardDisk() { //没有HaedDisk } @Override public void BuildOs() { computer.setOs("Win8"); } @Override public Computer getResult() { return computer; } } 再鞥家导演者: public class ComputerDirector { ComputerBuilder builder; public T410 constructT410() { builder = new T410Builder(); builder.buildCpu(); builder.buildHardDisk(); builder.BuildOs(); builder.buildRam(); return (T410) builder.getResult(); } public X201 constructX201() { builder = new X201Builder(); builder.buildCpu(); builder.buildHardDisk(); builder.BuildOs(); builder.buildRam(); return (X201) builder.getResult(); } } 测试: public class ComputerTest { public static void main(String[] args) { ComputerDirector director = new ComputerDirector(); Computer t410 = director.constructT410(); System.out.println(t410); System.out.println("-------------------------"); Computer x201 = director.constructX201(); System.out.println(x201); } } 与抽象工厂的区别 在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3856359.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Android程序设计》一3.5 Resources

3.5 Resources Android应用把图像、图标和用户界面布局文件都放在名为res的目录中。res目录通常至少包括4个子目录,如下所示:layout包含Android用户界面XML文件,这个文件将在第7章详细介绍。drawable包含绘制相关的工具,如之前所描述的应用图标。raw保存了应用执行时可能以stream(流)方式读取的文件。原始文件是为运行的应用提供调试信息的一种很好的方式,不需要访问网络来检索数据。values包含应用在执行中要读取的值,或应用在某些使用中的静态数据,如对UI字符串的国际化。应用通过方法Context.getResour ces()和类R来访问这些目录下的资源。要访问res目录下的数据,传统的Java开发人员可能会考虑编写代码构建相关的资源文件路径,然后使用文件API打开这些资源。加载完资源字节

优秀的个人博客,低调大师

Cassandra和HBase主要设计思路对比

Cassandra HBase 一致性 Quorum NRW策略 通过Gossip协议同步Merkle Tree,维护集群节点间的数据一致性 单节点,无复制,强一致性 可用性 1,基于Consistent Hash相邻节点复制数据,数据存在于多个节点,无单点故障。 2,某节点宕机,hash到该节点的新数据自动路由到下一节点做 hinted handoff,源节点恢复后,推送回源节点。 3,通过Gossip协议维护集群所有节点的健康状态,并发送同步请求,维护数据一致性。 4,SSTable,纯文件,单机可靠性一般。 1,存在单点故障,Region Server宕机后,短时间内该server维护的region无法访问,等待failover生效。 2,通过Master维护各Region Server健康状况和Region分布。 3,多个Master,Master宕机有zookeeper的paxos投票机制选取下一任Master。Master就算全宕机,也不影响Region读写。Master仅充当一个自动运维角色。 4,HDFS为分布式存储引擎,一备三,高可靠,0数据丢失。 5,HDFS的namenode是一个SPOF。 伸缩性 1,Consistent Hash,快速定位数据所在节点。 2,扩容需在Hash Ring上多个节点间调整数据分布。 1,通过Zookeeper定位目标Region Server,最后定位Region。 2,Region Server扩容,通过将自身发布到Master,Master均匀分布。 负载均 衡 请求Zookeeper取得整个集群地址,然后根据Consistent Hash选择合适的节点。client会缓存集群地址。 请求Zookeeper取读写数据路由表定位Region Server,Master会修改这个路由表。Client自身也会缓存一部分路由信息。 数据差异比较算法 Merkle Tree,Bloom Filter Bloom Filter 锁与事务 Client Timestap(Dynamo使用vector lock) Optimistic Concurrency Control 读写性能 数据读写定位非常快。 数据读写定位可能要通过最多6次的网络RPC,性能较低。 CAP点评 1,弱一致性,数据可能丢失。 2,可用性高。 3,扩容方便。 1,强一致性,0数据丢失。 2,可用性低。 3,扩容方便。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册