(1) 模板方法設(shè)計模式
模板方法( Method)模式的定義如下:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。它是一種類【行為型模式】。
該模式的主要優(yōu)點如下:
1. 它封裝了不變部分,擴展可變部分。它把認為是不變部分的算法封裝到父類中實現(xiàn),而把可變部分算法由子類繼承實現(xiàn),便于子類繼續(xù)擴展。
2. 它在父類中提取了公共的部分代碼,便于【代碼復(fù)用】。
3. 部分方法是由子類實現(xiàn)的,因此子類可以通過擴展方式增加相應(yīng)的功能,符合開閉原則。
該模式的主要缺點如下。
1.對每個不同的實現(xiàn)都需要定義一個子類,這會導(dǎo)致類的個數(shù)增加,系統(tǒng)更加龐大,設(shè)計也更加抽象,間接地增加了系統(tǒng)實現(xiàn)的復(fù)雜度。
2. 父類中的抽象方法由子類實現(xiàn),子類執(zhí)行的結(jié)果會影響父類的結(jié)果,這導(dǎo)致一種反向的控制結(jié)構(gòu),它提高了代碼閱讀的難 度。
3. 由于繼承關(guān)系自身的缺點,如果父類添加新的抽象方法,則所有子類都要改一遍。
咱們寫一個例子:
一個囚犯()的一天,起床 吃飯 勞動 吃飯 勞動 看新聞 吃飯 睡覺對于一個囚犯來說每天都是這樣來的。
public abstract class Prisoner {
protected String name;
/**
* 勞動的方法
*/
abstract void work();
/**
* 吃的方法
*/
abstract void eat();
/**
* 看新聞
*/
abstract void readNews();
/**
* 一天的生活
*/
public void life(){
eat();
work();
eat();
work();
eat();
readNews();
}
}
public class Star extends Prisoner{
public Star(String name) {
this.name = name;
}
@Override void work() {
System.out.println(this.name + "一直很煩惱的干活!");
}
@Override void eat() {
System.out.println(this.name + "吃不下牢里的飯");
}
@Override
void readNews() {
System.out.println(this.name + "一邊看新聞,一邊想選妃的輝煌時刻。");
}
}
public class Visitor {
public void visit(Prisoner prisoner){
System.out.println("我開始參觀體會囚犯的一天");
prisoner.life();
System.out.println("一天的參觀結(jié)束");

}
public static void main(String[] args) {
Prisoner wxf = new Star("張三");
Visitor jerry = new Visitor();
jerry.visit(wxf);
}
}
//我開始參觀體會囚犯的一天張三吃不下牢里的飯
//張三一直很煩惱的干活! 張三吃不下牢里的飯
//張三一直很煩惱的干活! 張三吃不下牢里的飯
//張三一邊看新聞,一邊想選妃的輝煌時刻。一天的參觀結(jié)束
這樣設(shè)計有什么好處:
每一個子類都不需要關(guān)心每天的生活流程,因為法律已經(jīng)規(guī)定了。每一類人根據(jù)自己的特性、狀態(tài)需求完成自己的實現(xiàn)就好了。
java程序員必備的基礎(chǔ)知識_java面向?qū)ο笾O(shè)計模式(二)
(2)策略設(shè)計模式
策略設(shè)計模式有難度,可以不學(xué)
聊一聊對象數(shù)組排序,要排序就要有個兩兩比較的過程。
我們怎么比較兩個對象,取出每一個值進行比較也行,但是寫出的代碼不優(yōu)雅,還記得我們學(xué)過的equals方法嗎?
我們既然能做等值比較,為什么不能做大小的比較呢?
public class User {
private String username;
private Integer age;
private Double height;
public User(String username, Integer age, Double height) {
this.username = username;
this.age = age;
this.height = height;
}
//get、set方法略
@Override
public String toString() {
return "User{" +"username='" + username +
'\'' + ", age=" + age +
", height=" + height + '}';
}
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",42,126.4);
User[] users = {user1,user2,user3,user4};
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(users[j].age > users[j+1].age){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
}
//結(jié)果沒問題:

//User{username='小楊', age=4, height=6.4}
//User{username='小王',age=12,height=153.4}
//User{username='小張',age=13,height=123.4}
//User{username='小李',age=14,height=163.4}
//這樣有什么問題啊,
public class User implements Comparable {
private String username;
private Integer age;
private Double height;
public User(String username, Integer age, Double height) {
this.username = username; this.age = age; this.height = height;
}
//get、set方法略
@Override
public String toString() {
return "User{" +
"username='" +
username + '\'' +
", age=" + age +
", height=" + height + '}';
}
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",4,6.4);
User[] users = {user1,user2,user3,user4};
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(users[j].compare(users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
if(users[j].compare(users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
@Override
public int compare(Object object) {
if(object instanceof User){
User user = (User)object;
if(this == user){
return 0;
} else {
if(this.getAge() > user.getAge()){
return 1;

} else if (this.getAge() < user.getAge()){
return -1;
} else {
return 0;
}
}
}
return -1;
}
}
對于上邊的編寫代碼的方式,我們看看有沒有什么值得優(yōu)化的地方?
如果我們想修改比較的內(nèi)容,就必須修改User類,這很明顯違反了開閉原則。
1、User不變
2、寫一個比較器的接口
public interface Comparator {
int compare(User user1,User user2);
}
3、寫一個比較器
public class UserAgeComparator implements Comparator {
@Override
public int compare(User user1, User user2) {
return user1.getAge() - user2.getAge();
}
}
4、寫一個工具類專門給User排序
public class SortUtil {
public void sort(User[] users, Comparator comparator){
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(comparator.compare(users[j],users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
}
}
5、排序開始
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",4,6.4);
User[] users = {user1,user2,user3,user4};
new SortUtil().sort(users,new UserAgeComparator());
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
它好在哪里了呢?
如果將來我們需要按照身高或者其他的方式排序呢?
我們再寫一個排序的比較器就行了:
public class UserAgeComparator implements Comparator{
@Override
public int compare(User user1, User user2) {
return user1.getAge() - user2.getAge();
}
}
同時User也不需要直接實現(xiàn)某些接口,是不是很棒。
其實我們還能結(jié)合我們超級數(shù)組來使用,大家不妨試一試。
win10共享打印機找不到打印機 找不到打印機設(shè)備解決
在Windows 10系統(tǒng)中,有時候共享打印機可能無法在網(wǎng)絡(luò)中顯示,導(dǎo)致打印機無法使用。這通常會讓人感到非常困擾,但幸運的是,這個問題有很多可以嘗試的解決方法。本文將介紹一些常見的原因以及針對性的解決步驟,幫助你快速解決Windows 10共享打印機找不到的問題。
一、檢查打印機共享設(shè)置
首先,確保打印機的共享功能已正確啟用。沒有正確設(shè)置打印機共享功能時,其他電腦是無法檢測到該打印機的。
步驟:
1. 在安裝打印機的電腦上,打開“控制面板”。
2. 選擇“設(shè)備和打印機”。
3. 右鍵點擊你要共享的打印機,選擇“打印機屬性”。
4. 在彈出的窗口中,切換到“共享”選項卡。
5. 勾選“共享此打印機”選項,并為打印機設(shè)置一個共享名(最好簡潔明了)。
二、更新打印機驅(qū)動程序
過時或損壞的打印機驅(qū)動程序也是導(dǎo)致共享打印機無法連接的常見原因之一。我們可以嘗試使用打印機衛(wèi)士更新打印機驅(qū)動程序來解決這個問題。
打印機衛(wèi)士(官方版)
智能修復(fù)打印機問題,自動安裝打印機驅(qū)動
立即下載
好評率97%
下載次數(shù):3665356
步驟:
1. 在打印機正常連接到電腦的前提下,打開打印機衛(wèi)士,點擊“立即檢測”。
2. 如果顯示打印機問題需要處理,點擊“一鍵修復(fù)”。
3. 等待修復(fù)成功后,重啟打印機,讓新版驅(qū)動正常生效。
三、確保網(wǎng)絡(luò)發(fā)現(xiàn)已開啟
在Windows 10中,網(wǎng)絡(luò)發(fā)現(xiàn)功能決定了你的電腦是否能夠看到其他設(shè)備,包括共享的打印機。如果網(wǎng)絡(luò)發(fā)現(xiàn)沒有啟用,打印機將無法被其他電腦檢測到。
步驟:
1. 打開“控制面板”,點擊“網(wǎng)絡(luò)和共享中心”。
2. 在左側(cè)欄選擇“更改高級共享設(shè)置”。
3. 確保“打開網(wǎng)絡(luò)發(fā)現(xiàn)”和“打開文件和打印機共享”選項被選中。
4. 點擊“保存更改”以確保設(shè)置生效。
四、檢查防火墻設(shè)置
防火墻設(shè)置也有可能會干擾打印機共享的正常工作。Windows防火墻默認情況下會阻止一些打印機共享協(xié)議。為了確保共享打印機的連接沒有被防火墻攔截,可以暫時禁用防火墻進行測試。
步驟:
1. 打開“控制面板”,點擊“Windows 防火墻”。
2. 在左側(cè)欄選擇“啟用或關(guān)閉Windows 防火墻”。
3. 在公用網(wǎng)絡(luò)和私人網(wǎng)絡(luò)下都選擇“關(guān)閉Windows 防火墻(不推薦)”。
4. 關(guān)閉防火墻后,再嘗試連接共享打印機。
五、手動添加共享打印機
如果上述方法都無法解決問題,你可以手動添加共享打印機。
步驟:
1. 打開“控制面板” > “設(shè)備和打印機”。
2. 點擊“添加打印機”。
3. 在彈出的窗口中,選擇“我想要的打印機不在列表中”。
4. 選擇“通過TCP/IP地址或主機名添加打印機”。
5. 輸入共享打印機的IP地址或者主機名,完成添加。
以上就是win10共享打印機找不到打印機的解決方法,希望對你有幫助。如果有遇到打印機連接、共享、報錯等問題,可以下載“打印機衛(wèi)士”進行立即檢測,只需要一步便可修復(fù)問題,提高大家工作和打印機使用效率。
打印機衛(wèi)士(官方版)
智能修復(fù)打印機問題,自動安裝打印機驅(qū)動
立即下載
好評率97%
下載次數(shù):3665356
win10共享打印機共享打印機找不到打印機找不到打印機設(shè)備共享打印機