JavaRush /Java Blog /Random-TL /Antas 37. Mga sagot sa mga tanong sa panayam sa antas ng ...
lichMax
Antas
Санкт-Петербург

Antas 37. Mga sagot sa mga tanong sa panayam sa antas ng paksa

Nai-publish sa grupo
Kamusta. Muli, hindi rin ako nakahanap ng mga sagot sa mga tanong na ito. Nagpasya akong i-post ang mga sagot na pinagsama-sama ko para sa aking sarili. Antas 37. Mga sagot sa mga tanong sa panayam sa paksa ng antas - 1Narito ang mga aktwal na tanong: Mga tanong para sa panayam:
  1. Ano ang mga pattern ng disenyo?
  2. Anong mga pattern ng disenyo ang alam mo?
  3. Sabihin sa amin ang tungkol sa pattern ng Singleton? Paano gawing ligtas ang thread?
  4. Sabihin sa amin ang tungkol sa pattern ng Pabrika?
  5. Sabihin sa amin ang tungkol sa pattern ng AbstractFactory
  6. Sabihin sa amin ang tungkol sa pattern ng Adaper, ang mga pagkakaiba nito sa Wrapper?
  7. Sabihin sa amin ang tungkol sa pattern ng Proxy
  8. Ano ang isang iterator? Anong mga interface na may kaugnayan sa iterator ang alam mo?
  9. Bakit kailangan natin ang klase ng Arrays?
  10. Bakit natin kailangan ang klase ng Collections?
Narito ang aking mga sagot: Ang aking mga sagot:
  1. Ang mga pattern ng disenyo ay mahusay na itinatag, matagumpay na mga solusyon sa mga pinakakaraniwang problema na lumitaw sa panahon ng disenyo at pagbuo ng mga programa o ang kanilang mga bahagi.

  2. Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy, Bridge. MVC_

  3. Kapag kailangan mo lamang ng isang instance ng isang klase upang umiral sa isang programa, ang pattern ay ginagamit Singleton. Mukhang ganito (lazy initialization):

    clas Singleton {
    	private Singleton instance;
    
    	private Singleton() {}
    
    	public static Singletot getInstance() {
    		if (instance == null)
    			instance = new Singleton();
    		return instance;
    	}
    }

    Upang gawin itong ligtas sa thread, maaari kang magdagdag getInstance()ng modifier sa pamamaraan synchronized. Ngunit hindi ito ang magiging pinakamahusay na solusyon (ngunit ang pinakasimpleng). Ang isang mas mahusay na solusyon ay ang pagsulat ng pamamaraan getInstancesa ganitong paraan (double-check na pag-lock):

    public static synchronized Singleton getInstance() {
    	if (instance == null)
    		synchronized(Singleton.class) {
    			instance = new Singleton();
    		}
    	return instance;
    }

  4. Ang pattern Factoryay isang generative pattern. Pinapayagan ka nitong lumikha ng mga bagay kapag hinihiling (halimbawa, sa ilalim ng ilang mga kundisyon). Mukhang ganito:

    class Factory{
    	public static Object1 getObject1() {
    		return new Object1();
    	}
    
    	public static Object2 getObject2() {
    		return new Object2();
    	}
    
    	public static Object3 getObject3() {
    		return new Object3();
    	}
    }

    Mayroon ding pagkakaiba-iba ng pattern na ito na tinatawag na FactoryMethod. Ayon sa pattern na ito, ang iba't ibang mga bagay ay nilikha sa isang paraan, depende sa papasok na data ng input (mga halaga ng parameter). Ang lahat ng mga bagay na ito ay dapat magkaroon ng isang karaniwang ninuno (o isang karaniwang maipapatupad na interface). Mukhang ganito:

    class FactoryMethod {
    	public enum TypeObject {
    		TYPE1,
    		TYPE2,
    		TYPE3
    	}
    
    	public static CommonClass getObject(TypeObject type) {
    		switch(type) {
    			case TYPE1:
    				return new Object1();
    			case TYPE2:
    				return new Object2();
    			case TYPE3:
    				return new Object3();
    			default:
    				return null;
    		}
    	}
    }

    Mga klase Object1, Object2at Object3magmana mula sa klase CommonClass.

  5. Ang pattern Abstract Factoryay isa ring generative na pattern ng disenyo. Ayon sa pattern na ito, isang abstract na pabrika ang nilikha na nagsisilbing isang template para sa ilang mga kongkretong pabrika. Narito ang isang halimbawa:

    class Human {}
    
    class Boy extends Human {}
    class TeenBoy extends Human {}
    class Man extends Human {}
    class OldMan extends Human {}
    
    class Girl extends Human {}
    class TeenGirl extends Human {}
    class Woman extends Human {}
    class OldWoman extends Human {}
    
    interface AbstractFactory {
    	Human getPerson(int age);
    }
    
    class FactoryMale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Boy();
    		if (age >= 12 && age <= 20)
    			return new TeenBoy();
    		if (age > 20 && age < 60)
    			return new Man();
    		return new OldMan();
    	}
    }
    
    сlass FactoryFemale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Girl();
    		if (age >= 12 && age <= 20)
    			return new TeenGirl();
    		if (age > 20 && age < 60)
    			return new Woman();
    		return new OldWoman();
    	}
    }

  6. Ang pattern Adapteray isang structural pattern. Ang pagpapatupad nito ay nagbibigay-daan sa isang bagay ng isang uri na magamit kung saan ang isang bagay ng ibang uri ay kinakailangan (karaniwan ay mga abstract na uri). Isang halimbawang pagpapatupad ng pattern na ito:

    interface TotalTime {
    	int getTotalSeconds();
    }
    interface Time {
    	int getHours();
    	int getMinutes();
    	int getSeconds();
    }
    
    class TimeAdapter extends TotalTime {
    	private Time time;
    	public TimeAdapter(Time time) {
    		this.time = time;
    	}
    	public int getTotalTime() {
    		return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60;
    	}
    }
    
    class TotalTimeAdapter extends Time {
    	private TotalTime totalTime;
    	public TotalTimeAdapter(TotalTime totalTime) {
    		this.totalTime = totalTime;
    	}
    
    	public int getSeconds() {
    		return totalTime % 60;
    	}
    
    	public int getMinutes() {
    		return (totalTime / 60) % 60;
    	}
    
    	public int getHours() {
    		return totaltime/ (60 * 60) ;
    	}
    }
    
    class Main {
    	public static void main(String[] args) {
    		Time time = new Time() {
    			public int getSeconds() {
    				return LocalTime.now().getSecond();
    			}
    
    			public int getMinutes() {
    				return LocalTime.now().getMinute();
    			}
    
    			public int getHours() {
    				return LocalTime.now().getHour() ;
    			}
    		};
    
    		TotalTime totalTime = new TimeAdapter(time);
    		System.out.println(totalTime.getTotalSeconds());
    
    		TotalTime totalTime2 = new TotalTime() {
    			public int getTotalSeconds() {
    				LocalTime currTime = LocalTime.now();
    				return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60;
    			}
    		};
    
    		Time time2 = new TotalTimeAdapter(totalTime2);
    		System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds());
    	}
    }

    При реализации паттерна Wrapper создаётся класс, который оборачивает исходный класс и реализует тот же интерфейс, который реализует исходный класс. Таким образом, это позволяет расширить функциональность исходного класса и использовать новый класс там, где ожидается использование исходного класса. Это отличается от реализации паттерна Adapter тем, что в данном случае используется один интерфейс (тот же, что есть у исходного класса). В паттерне Adapter же используется два интерфейса, и класс, который оборачивает экземпяр исходного класса, реализует совсем другой инферфейс, не интерфейс исходного класса.

  7. Паттерн Proxy — это структурный паттерн проектирования. Он нужен для того, чтобы контролировать доступ к Howому-то an objectу. Для этого пишется класс по типу "обёртка", то есть внутрь класса передаётся исходный an object, реализующий некий интерфейс, сам класс тоже реализует этот интерфейс, и в каждом методе этого класса вызывается похожий метод у исходного an object. Реализация того же интерфейса, что и у исходного an object, позволяет подменить исходный an object прокси-an objectом. Также это позволяет, не меняя исходного an object, "навешивать" на его методы Howую-то специальную дополнительную функциональность (например, логирование, проверка прав доступа, кэширование и т.д.). Пример:

    interface Bank {
    	void setUserMoney(User user, double money);
    	double getUserMoney(User user);
    }
    
    class CitiBank implements Bank { //оригинальный класс
    	public void setUserMoney(User user, double money) {
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		UserDAO.getUserMoney(user);
    	}
    }
    
    class SecurityProxyBank implements Bank {
    	private Bank bank;
    
    	public SecurityProxyBank(Bank bank) {
    		this.bank = bank;
    	}
    
    	public void setUserMoney(User user, double money) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't change money value");
    
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't get money value");
    
    		UserDAO.getUserMoney(user);
    	}

  8. Итератор — это специальный внутренний an object коллекции, который позволяет последовательно перебирать элементы этой коллекций. Этот an object должен реализовывать интерфейс Iterator<E>, либо ListIterator<E> (для списков). Также, для того, чтобы перебирать элементы коллекции, коллекция должна поддерживать интерфейс Iterable<E>. Интерфейс Iterable<E> содержит всего один метод — iterator(), который позволяет извне получить доступ к итератору коллекции.

    Интерфейс Iterator<E> содержит следующие методы:

    • boolean hasNext() — проверяет, есть ли в коллекции ещё Howой-то элемент

    • E next() — позволяет получить очередной элемент коллекции (после получения element, внутренний курсор итератора передвигается на следующий элемент коллекции)

    • void remove() — удаляет текущий элемент из коллекции

    Интерфейс же ListIterator<E> содержит такие методы:

    • boolean hasNext() — проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим)

    • E next() — возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент)

    • int nextIndex() — возвращает индекс следующего element

    • void set(E e) — устанавливает meaning текущего element void add(E e). Добавляет элемент в конец списка.

    • boolean hasPrevious() — проверяет, существует ли Howой-то элемент в коллекции перед данным элементом

    • E previous() — возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции

    • int previousIndex — возвращает индекс предыдущего element коллекции

    • void remove() — удаляет текущий элемент коллекции

    • void add(E e) — добавляет элемент e после текущего element коллекции

  9. Ang klase Arraysay isang utility class na idinisenyo para sa iba't ibang manipulasyon ng array. Ang klase na ito ay may mga pamamaraan para sa paggawa ng array sa isang listahan, paghahanap sa pamamagitan ng isang array, pagkopya ng isang array, paghahambing ng mga arrays, pagkuha ng array hashcode, na kumakatawan sa isang array bilang isang string, atbp.

  10. Ang klase Collectionsay isang utility class para sa pagtatrabaho sa mga koleksyon. Ang klase na ito ay may mga pamamaraan para sa pagdaragdag ng mga elemento sa isang koleksyon, pagpuno sa isang koleksyon ng mga elemento, paghahanap ng isang koleksyon, pagkopya ng isang koleksyon, paghahambing ng isang koleksyon, paghahanap ng maximum at minimum na mga elemento ng isang koleksyon, pati na rin ang mga pamamaraan para sa pagkuha ng mga partikular na pagbabago ng mga koleksyon ng mga kilalang uri (halimbawa, maaari kang makakuha ng koleksyon na ligtas sa thread o isang hindi nababagong koleksyon na may isang elemento).

Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION