面向对象设计原则
单一职责原则
其实就是开发人员经常说的“高内聚,低耦合”
也就是说每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。在设计模式中,所有的设计模式都遵循这一原则
开闭原则
核心思想:一个对象对外扩展开放,对修改关闭
其实开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是修改现有代码
也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动他,而是要保证他能一直运行下去,如何能够做到这一点呢?这就需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现则是可以改变和扩展的
里氏替换原则
核心思想:在任何分类出现的地方都可以用它的子类来替代
其实就是说,同一个继承体系中的对象应该有共同的行为特征
依赖注入原则
核心思想:要依赖于抽象,不要依赖于具体实现
其实就是说,在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。为了实现这一原则,就要求我们在编程的时候针对抽象类或者接口编程,而不是针对具体实现编程
接口分离原则
核心思想:不应该强迫程序依赖他们不需要使用的方法
其实就是说:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中
迪米特原则
核心思想:一个对象应当对其他对象尽可能少的 了解
其实就是说:降低各个对象之间的耦合,提供系统的可维护性。在模块之间应该只通过接口编程,而不理会模板的内部工作原理,它可以使各个模块耦合度降到最低,促进软件的复用
设计模式
概述
设计模式是一种被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
设计模式不是一种方法和技术,而是一种思想
设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低内聚,高耦合,使设计的程序可复用
学习设计模式能够促进对面向对象思想的理解,反之亦然。他们相辅相成
分类
创建型模式 对象的创建
简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式(6个)
结构型模式 对象的组成(结构)
外观模式,适配器模式,代理模式,装饰模式,桥接模式,组合模式,享元模式(7个)
行为型模式 对象的行为
模板方法模式,观察者模式,状态模式,职责链模式,命令模式,访问者模式,策略模式,备忘录模式,迭代器模式,解释器 模式(10个)
简单工厂模式
概述
又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例(动物工厂.某个制造动物的方法())
优点
客户端不需要在负责对象的创建,从而明确了各个类的职责
缺点
这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护
动物抽象类:public abstract Animal { public abstract void eat(); }
具体狗类:public class Dog extends Animal {}
具体猫类:public class Cat extends Animal {}
开始,在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就知道了一个专门的类来创建对象。
public class AnimalFactory {
private AnimalFactory(){}
//public static Dog createDog() {return new Dog();}
//public static Cat createCat() {return new Cat();}
//改进
public static Animal createAnimal(String animalName) {
if(“dog”.equals(animalName)) {}
else if(“cat”.equals(animale)) {
}else {
return null;
}
}
}
工厂方法模式
概述
工厂方法模式中抽象工厂类负责定义创建的对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现
优点
客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性
缺点
需要额外的编写代码,增加了工作量
动物抽象类:public abstract Animal { public abstract void eat(); }
工厂接口:public interface Factory {public abstract Animal createAnimal();}
具体狗类:public class Dog extends Animal {}
具体猫类:public class Cat extends Animal {}
开始,在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就知道了一个专门的类来创建对象。发现每次修改代码太麻烦,用工厂方法改进,针对每一个具体的实现提供一个具体工厂。
狗工厂:public class DogFactory implements Factory {
public Animal createAnimal() {…}
}
猫工厂:public class CatFactory implements Factory {
public Animal createAnimal() {…}
}
单例模式
概述
单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供
优点
在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能
缺点
没有抽象层,因此扩展很难
职责过重,在一定程度上违背单一职责
/*
如何保证类在内存中只有一个对象
1、构造方法私有
2、在类的成员变量的位置上创建一个对象
3、提供一个公共的方法给外界获取到该对象
*/
//单例中的饿汉式:类一加载,对象就创建好了
class Cat{
private Cat(){}
private Cat cat=new Cat();
public static Cat getCat(){
return cat;
}
}
//单例中的懒汉式:用的时候,再去创建对象(1、懒加载 2、容易产生线程安全问题)
class Cat{
private Cat(){}
private Cat cat=null;
public static Cat getCat(){
if(cat==null)
return cat=new Cat();
else
return cat;
}
}
网络编程
概述
就是用来实现网络互连的不同计算机上运行的程序键可以进行数据交换
计算机网络
是指将地理位置不同的具有独立功能的多台计算机及外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网格通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
网络模型
计算机网络之间以何种规则进行通信,就是网络模型研究问题
网络模型一般是指
OSI(Open System Interconnection开放系统互连)
TCP/IP参考模型(HTTP/HTTPS)
网络参考模型图
物理层:主要定义物理设备标准,如网线的接口类型、光前的接口类型、各种传输介质的传输速率等。它的的主要作用是传输比特流(就是由1,0转化为电流强弱来进行传输,到达目的地后在转化为1,0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特
数据链路层:主要将从物理层接受的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。这一层工作的设备是交换机,数据通过交换机来传输
网络层:主要将从下层接收到的数据进行IP地址(例如192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包
传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接受的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
表示层:主要是进行对接受的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转成人能够识别的东西(如图片、声音等))
应用层:主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)
网络通信三要素
IP地址:InetAddress
网络中设备的表示,不易记忆,可用主机名
端口号
用于表示进程的逻辑地址,不同进程的表示
传输协议
通讯的规则
常见协议:TCP,UDP
IP地址
概述
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和表示发送的计算机,在TCP/IP协议中,这个标识号就是IP地址
网络编程的三要素:
1、IP地址
2、端口号
3、协议
举例:
假设我想和对象表白了,怎么办?
1、我要去找到对象 --IP地址
2、对Ta表白,跟她说话,对着耳朵说 -- 端口号
3、我要说什么呢?"I Love You"
但是呢,她听不懂,因为没有学过英文
我就没有必要去说英文,说汉语就可以了,说:“我爱你” --协议
IP地址:
网络中计算机的唯一标识。
但是,我们计算机只能识别二进制的数据,所以我们的想的IP地址在计算机中存储的形式
应该也是一个二进制数据。
IP:192.168.2.157
换算成二进制:11000000.10101000.00000010.10011101
实际上存储的是:11000000101010000000001010011101,但是呢,这样的形式,我们在学习
过程中,难免遇到配置地址,记忆等等涉及到IP地址操作的时候,表示起来会很麻烦。
所以,为了方便IP地址的表示,我们就把IP地址上的每一个字节上的数据换算成十进制,然后字节
与字节之间用.分割表示。
这样的表示法:叫做点分十进制表示法
IP地址的组成:网络号段 + 主机号段
IP地址的分类:
A类:第一个号段为网络号段 + 后面三个号段都为主机号段
可以有:256*256*255 这么多主机相连
1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类:前两个号段为网络号段 + 后两个是主机号段
可以有:256*255 这么多主机相连
128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。
169.254.X.X是保留地址。
C类:前三个都为网络号段 + 后一个号段为主机号段
可以连255个主机
192.0.0.1---223.255.255.254
192.168.X.X是私有地址
D类:224.0.0.1---239.255.255.254
E类:240.0.0.1---247.255.255.254
特殊的IP地址:
1、loclhost = 本机 = 127.0.0.1
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
2、广播地址:
x.x.x.255
3、网络地址:
x.x.x.0
三个DOS命令:
ipconfig: Windows查看IP地址
Linux: centOS6/7 6:ifconfig 7:ip addr
ping: 测试网络是否联通
ping + IP地址/host名
InetAddress类的使用
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress,供我们使用
成员方法
static InetAddress getByName(String host) 确定主机名称的IP地址
public String getHostName() 获取此IP地址的主机名
public String getHostAddress() 返回文本显示中的IP地址字符串
class Test{
public static void main(String[] args){
InetAddress addr=InetAddress.getByName("192.168.1.1");
System.out.println(address);
String hostName=address.getHostName();
System.out.println(hostName);
String hostAddress=address.getHostAddress();
System.out.println(hostAddress);
}
}
//输出
/192.168.1.1
我的主机名
192.168.1.1