java设计模式 观察者模式 代码第一个
public interface RandomNumberListener {//接口
public void numberChanged(double d);
}
第二个
public class Consol implements RandomNumberListener{
@Override
public void numberChanged(double d) {
System.out.println(d);
}
}
第三个
public class SwingWindow
extends JFrame
implements RandomNumberListener{//观察者
private JLabel label = new JLabel();
public SwingWindow(){
this.getContentPane().add( label);
this.setSize(300,200);
this.setVisible(true);
}
@Override
public void numberChanged(double d) {
label.setText(String.valueOf(d));
}
}
第四个
public class RandomNumber {//业务
private double r;
private ListRandomNumberListenerlisteners = new ArrayListRandomNumberListener();
//添加所有观察者
public void addRandomNumberListener(RandomNumberListener lis){
listeners.add(lis);
}
public void random(){
r = Math.random();
//数据发生改变,通知所有的观察者
for (RandomNumberListener lis : listeners) {
lis.numberChanged(r);
}
}
}
第五个
public class Test {
public static void main(String[] args) throws InterruptedException{
RandomNumber rn = new RandomNumber();
SwingWindow sw = new SwingWindow();
Consol c = new Consol();
rn.addRandomNumberListener(sw);
rn.addRandomNumberListener(c);
while(true){
rn.random();
Thread.sleep(new Random().nextInt(3000) 1000L);
}
}
}
JAVA23种设计模式设计模式主要分三个类型:创建型、结构型和行为型 。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类 。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离 , 使得同样的构建过程可以创建不同的表示 。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象 。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示 。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新 。
八、Template Method , 模板方法:定义一个操作中的算法的骨架 , 而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤 。
九、Command,命令模式:将一个请求封装为一个对象 , 从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作 。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为 。对象看起来似乎改变了他的类 。
十一、Strategy , 策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换 , 本模式使得算法可以独立于使用它们的客户 。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互 。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作 。
十五、Interpreter,解释器模式:给定一个语言 , 定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子 。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态 , 并在该对象之外保存这个状态 。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性 。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面 , fa?ade提供了一高层接口,这个接口使得子系统更容易使用 。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作 。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说 , Decorator模式相比生成子类更加灵活 。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化 。
二十三、Flyweight , 享元模式
23种设计模式要在这里详细的都说一遍内容实在太多了?。?推荐你一本好书《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况 , 看了收获挺大的!百度里面搜“设计模式”,第一条中设计模式百度百科中就有首推该图书,浏览量在20几万以上的,不会错的 。
祝你早日学会设计模式!
java 设计模式(工厂方法)面向抽象(抽象类或接口)编程 。
IWorkFactory studentWorkFactory = new StudentWorkFactory();注意java经典设计模式代码:类型是接口类型java经典设计模式代码 , 即抽象工厂,抽象工厂生产java经典设计模式代码的是抽象产品,而new的则是具体工厂,是由子类实现的,具体工厂生产具体产品 。面向抽象的好处:1.在设计抽象的时候不用管具体的实现,只要定义接口知道它用来干什么就行,这样,我只需要知道抽象接口就能继续下面的开发设计工作java经典设计模式代码了,而不用事先设计具体的实现内容;2. 可以扩展多个子类实现抽象接口,更利于系统后期的扩展,而对原系统不造成任何影响 , 即:开-闭原则 。
TeacherWork tt = new TeacherWork(); 不用说就是面向具体实现类编程,缺点就是扩展性不好,对系统后期维护扩展影响较大 。
举个简单的例子:
假如在系统的A.java中代码中使用了TeacherWork 类型对象,是满足了目前软件的需求,但是,如果有一天需求变化了需要一个StudentWork 类型对象,该怎么办?只能修改A.java类来满足这样的修改需求 。这样就影响了原来系统结构稳定性,需要重新调试和测试,而这带来的维护成本是非常大的,有时可能还会带来系统错误,而影响系统运行 。
如果在A.java类中应用Work接口类型就不会存在这种问题 , A.java不需要任何修改 , 只需要修改注入到A中的Work接口的具体实现类即可 。
面向抽象编程的好处就在于对系统维护和扩展上,即在不影响原系统稳定运行的基础上增加新的扩展行为,即要符合“开-闭”原则 。可能会因此而失去一定的效率问题,但是对于后期的维护成本来说 , 这个可以忽略不计 。推荐你一本好书:《软件秘笈-设计模式那点事》其中讲解的设计模式很到位,还有每个模式的静态类图和JDK中设计模式的具体分析讲解,读了收获一定很大 。祝你成功!
Java写一套漂亮的代码 , 哪些设计模式比较常用对于代码结构上 , 看起来漂亮起作用的模式 , 常用的策略模式 , 工厂模式 , 装饰模式和观察者模式吧 。但也看情景,生搬硬套会显得不够简洁的
急求java设计模式,要求用到两种设计模式 求详细代码.饿汉式单例类
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
2.懒汉式单例类
//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意 , 这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronizedstatic Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
//对懒汉式单例的改进(错误的改进)
//实际上,只有在第一次创建对象的时候需要加锁,之后就不需要了,这样可以提升性能
public synchronizedstatic Singleton2 getInstance() {
if (instance == null) {
synchronized(instance){ //锁住当前实例对象
if(instance == null){
instance = new Singleton2();
}
}
}
return instance;
}
错误原因:
aA、B线程同时进入了第一个if判断
bA首先进入synchronized块 , 由于instance为null,所以它执行instance = new Singleton();
c由于JVM内部的优化机制 , JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块 。
dB进入synchronized块 , 由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序 。
e此时B线程打算使用Singleton实例,却发现它没有被初始化 , 于是错误发生了 。
正确改进(使用内部类):
JVM内部的机制能够保证当一个类被加载的时候 , 这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,
并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题 。
同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题
public?class?Singleton?{??
??
/*?私有构造方法 , 防止被实例化?*/??
private?Singleton(){
}
/*?此处使用一个内部类来维护单例?*/??
private?static?class?SingletonFactory?{??
private?static?Singleton?instance?=?new?Singleton();??
}
/*?获取实例?*/??
public?static?Singleton?getInstance()?{??
return?SingletonFactory.instance;??
}
/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??
public?Object?readResolve()?{??
return?getInstance();??
}
}
其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建 , 也会出错????
第二种改进:
因为我们只需要在创建类的时候进行同步 , 所以只要将创建和getInstance()分开,
单独为创建加synchronized关键字 , 也是可以的
public class Singleton{
private static Singletoninstance=null;
private Singleton(){}
privatestatic synchronized void Init(){
if(instance==null)
instance=new Singletion();
}
public static Singleton getInstance(){
if(instance==null){
Init();
}
return instance;
}
}
3.登记式单例类
import java.util.HashMap;
import java.util.Map;
//登记式单例类.
//类似Spring里面的方法 , 将类名注册 , 下次从里面直接获取 。
public class Singleton3 {
private static MapString,Singleton3 map = new HashMapString,Singleton3();
static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}
//保护的默认构造子
protected Singleton3(){}
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName();
System.out.println("name == null" "---name=" name);
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一个示意性的商业方法
public String about() {
return "Hello, I am RegSingleton.";
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}
【java经典设计模式代码 java经典设计模式代码怎么写】java经典设计模式代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java经典设计模式代码怎么写、java经典设计模式代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 6763是什么cpu,6765是什么处理器
- 680显卡搭配什么cpu,680显卡多大功率
- 单机尾行游戏,系列单机游戏
- 40个linux命令 linux三十个基本命令
- 店铺如何推广,店铺如何推广运营
- 电脑突然断电会丢失什么,电脑突然断电后会自动重启吗
- 视频号直播怎么多人连麦,视频号如何三个人连麦
- linux上网的命令 linux命令行连网
- oracle查询用户明细,oracle 查看用户